为什么枚举可以具有包私有构造函数?
2022-08-31 14:59:28
既然枚举构造函数只能由其常量调用,那么为什么允许它是包私有的呢?
构造函数实际上不是包私有的...这是隐式接口方法隐式的方式,即使您不添加关键字也是如此。private
public
JLS(§8.8.3)的相关部分指出:
如果没有为普通类的构造函数指定访问修饰符,则该构造函数具有默认访问权限。
如果没有为枚举类型的构造函数指定访问修饰符,则构造函数为 。
private
如果枚举类型 (§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;
}
}
你不能从包中的另一个类引用它。如果尝试,则会收到编译器错误:
无法实例化 MyEnum 类型