为什么Java中枚举中的构造函数只能声明为私有?

为什么Java中枚举中的构造函数只能声明为私有?,java,constructor,enums,Java,Constructor,Enums,可能重复: 下面的代码只是演示了在Java中使用enum。它与该enum的成员的值无关,只是求和 package enumtest; enum Sum { Pen(10),Pencil(15),Eraser(5); private int value; private Sum(int value) { this.value=value; } public int getValue() {

可能重复:

下面的代码只是演示了在Java中使用
enum
。它与该
enum
的成员的值无关,只是求和

package enumtest;

enum Sum
{        
    Pen(10),Pencil(15),Eraser(5);

    private int value;

    private Sum(int value)
    {
        this.value=value;
    }

    public int getValue()
    {
        return(value);
    }
}

final public class Main
{
    public static void main(String...args)
    {
        int sum=0;

        for(Sum o:Sum.values())
        {
            sum+=o.getValue();
        }

        System.out.println("sum = "+sum);
    }
}


它在控制台上显示
sum=30
。这里只有一个问题。通常,在类中,构造函数被声明为
public
,那么为什么
enum
中的构造函数只能声明为
private
?它不允许使用其他修饰符
public
protected
。即使将其声明为public,也会导致编译时错误。为什么?

您也可以在不使用任何关键字的情况下声明它们,例如just
Sum(int-value)


原因是Java本身将为您创建各种实例,并作为单例—这是枚举正常工作所必需的
public
protected
将意味着或允许其他调用方创建同一枚举的其他实例,这将破坏单例保证。

Hmm但包受保护(无修改器)构造函数很好,我们可以为该类提供基本相同的参数。如果没有为普通类的构造函数指定访问修饰符,则构造函数具有默认访问权限。如果没有为枚举类型的构造函数指定访问修饰符,则该构造函数是私有的。如果枚举类型(§8.9)的构造函数声明为
public
protected
,则这是编译时错误。来自[§8.8.3]JLS。上述内容适用于Java 6语言规范。在Java 8规范中,有关枚举构造函数可见性的信息现在处于可用状态。