为什么一个枚举有一个包私有构造函数?
由于枚举构造函数只能由其常量调用,为什么它被允许为包私有?
构造函数实际上并不是包私有的……即使不添加关键字,也是隐式的。
JLS( §8.8.3 )的相关部分规定:
如果没有为普通类的构造函数指定访问修饰符,则构造函数具有默认访问权限。
如果没有为枚举types的构造方法指定访问修饰符,则构造方法是
private
。如果枚举types(§8.9)的构造函数被声明为
public
或protected
那么这是一个编译时错误。
这是一个语言的怪癖:枚举构造函数是隐式私有的。
有趣的是,如果你声明一个包可见的枚举构造函数,像这样:
public enum MyEnum { A(0), B(1); private final int i; MyEnum(int i) { this.i = i; } public int getI() { return i; } }
你不能从包中的其他类引用它。 如果你尝试,你会得到编译器错误:
无法实例化MyEnumtypes