Som*_*Lee 3 java enums constructor
枚举构造函数的默认访问修饰符“私有”多久了?从一开始还是在 Java 8 中发生了变化?如果是的话,那么没有访问修饰符的构造函数声明的默认访问修饰符是什么?(我猜它是默认的(包可访问的)就像其他java类的构造函数一样。)
我找到了一些与此相关的参考文档,但找不到确切的答案。这是我发现的,
从什么时候开始枚举构造函数的默认访问修饰符是“private”?
总是。你不能创建新的枚举,这就是它们的要点。您不能拥有枚举的非私有构造函数(使用 openjdk16 中的 javac):
> cat Test.java
public enum Test {
FOO, BAR;
public Test() {}
}
> javac Test.java
Test.java:3: error: modifier public not allowed here
Run Code Online (Sandbox Code Playgroud)
让我们尝试使用 java6(是的,我有 javac6,并且可以在新的 java 上运行它)。
> java -jar javac6.jar -bootclasspath openjdk6-rt.jar Test.java
Test.java:3: error: modifier public not allowed here
Run Code Online (Sandbox Code Playgroud)
所以,这个错误已经二十年没有改变了。
让我们检查一下 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
Run Code Online (Sandbox Code Playgroud)
因此,私人的。一直如此,永远如此。这就像问:“圆有角吗?”。
答案是:不,从来没有。如果一个圆有一个角,它就不再是一个了。具有公共构造函数的枚举不是枚举。