为什么一个枚举有一个包私有构造函数?

由于枚举构造函数只能由其常量调用,为什么它被允许为包私有?

构造函数实际上并不是包私有的……即使不添加关键字,也是隐式的。

JLS( §8.8.3 )的相关部分规定:

如果没有为普通类的构造函数指定访问修饰符,则构造函数具有默认访问权限。

如果没有为枚举types的构造方法指定访问修饰符,则构造方法是private

如果枚举types(§8.9)的构造函数被声明为publicprotected那么这是一个编译时错误。

这是一个语言的怪癖:枚举构造函数是隐式私有的。

有趣的是,如果你声明一个包可见的枚举构造函数,像这样:

 public enum MyEnum { A(0), B(1); private final int i; MyEnum(int i) { this.i = i; } public int getI() { return i; } } 

你不能从包中的其他类引用它。 如果你尝试,你会得到编译器错误:

无法实例化MyEnumtypes

Interesting Posts