为什么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,也会导致编译时错误。为什么?您也可以在不使用任何关键字的情况下声明它们,例如justSum(int-value)
原因是Java本身将为您创建各种实例,并作为单例—这是枚举正常工作所必需的
public
或protected
将意味着或允许其他调用方创建同一枚举的其他实例,这将破坏单例保证。Hmm但包受保护(无修改器)构造函数很好,我们可以为该类提供基本相同的参数。如果没有为普通类的构造函数指定访问修饰符,则构造函数具有默认访问权限。如果没有为枚举类型的构造函数指定访问修饰符,则该构造函数是私有的。如果枚举类型(§8.9)的构造函数声明为public
或protected
,则这是编译时错误。来自[§8.8.3]JLS。上述内容适用于Java 6语言规范。在Java 8规范中,有关枚举构造函数可见性的信息现在处于可用状态。