java - 从什么时候开始枚举构造函数的默认访问修饰符是私有的?
问题描述
枚举构造函数的默认访问修饰符“私有”多久了?从一开始还是在 Java 8 中发生了变化?如果是这样,那么没有访问修饰符的构造函数声明的默认访问修饰符是什么?(我猜它是默认的(包可访问),就像其他 java 类的构造函数一样。)
我找到了一些与此相关的参考文件,但找不到确切的答案。这是我发现的,
- Java8 JLS 8.9.2,在枚举声明中,没有访问修饰符的构造函数声明是私有的。
- Java7 JLS 8.9.2,如果枚举类型没有构造函数声明,则自动提供不带参数的私有构造函数(以匹配隐式空参数列表)。
解决方案
从什么时候枚举构造函数的默认访问修饰符为“私有”?
总是。你不能创建新的枚举,这就是它们的重点。您不能拥有枚举的非私有构造函数(使用来自 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
因此,私人。一直是,永远都是。这就像在问:“圆圈有角吗?”。
答案是:不。永远不会。如果一个圆有一个角,它就不再是一个。具有公共构造函数的枚举不是枚举。
推荐阅读
- c# - linux 平台上 C# 中的自定义 posix 信号不起作用
- r - rvest - 从 HTML 字符串中删除标签及其内容
- django - 您将如何在 django 中建模一种对象的层次结构,其中一种类型可能具有自己的子对象?
- c++ - MSVC C++17 (2019) 上的 Operator() 崩溃程序
- python - 如果输入负整数,我的程序应该如何创建错误?(Python)
- html - 如何更改拖动级别链接的 CSS 样式
- flutter - Flutter Web 中的纯音频
- r - 估计调节剂的高水平和低水平的条件效应
- amazon-web-services - 如何在詹金斯步骤中使用 aws jenkins 插件“ecrLogin”
- installation - 安装本地包时出现内部错误