从什么时候枚举构造函数的默认访问修饰符为“私有”?
总是。你不能创建新的枚举,这就是它们的重点。您不能拥有枚举的非私有构造函数(使用来自 openjdk16 的 javac):
> cat Test.java
public enum Test {
FOO, BAR;
public Test() {}
}
> javac Test.java
Test.java:3: error: modifier public not allowed here
让我们试试 java6(是的,我有 javac6,可以在新的 javas 上运行它)。
> java -jar javac6.jar -bootclasspath openjdk6-rt.jar Test.java
Test.java:3: error: modifier public not allowed here
所以,这个错误在 2 年里没有改变。
让我们检查一下javac6中的访问级别!
> cat Test.java
public enum Test {
FOO, BAR;
Test() {}
}
> java -jar javac6.jar -bootclasspath openjdk6-rt.jar Test.java
> javap -c -private Test
.... lots of decompiled bytecode
private Test();
Code:
0: aload_0
1: aload_1
2: iload_2
3: invokespecial #18 // Method java/lang/Enum."<init>":(Ljava/lang/String;I)V
6: return
... more decompiled bytecode
因此,私人。一直是,永远都是。这就像在问:“圆圈有角吗?”。
答案是:不。永远不会。如果一个圆有一个角,它就不再是一个。具有公共构造函数的枚举不是枚举。