首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从什么时候开始枚举构造函数的默认访问修饰符是私有的?

从什么时候开始枚举构造函数的默认访问修饰符是私有的?
EN

Stack Overflow用户
提问于 2021-05-11 12:47:04
回答 1查看 134关注 0票数 3

枚举构造函数的默认访问修饰符是“私有”多久了?从一开始还是在Java 8中发生了变化?如果是,那么没有访问修饰符的构造函数声明的默认访问修饰符是什么?(我猜它和其他java类的构造函数一样,是默认的(包可访问的)。)

我找到了一些与此相关的参考文件,但找不到确切的答案。这是我发现的

  1. Java8 JLS 8.9.2,在枚举声明中,没有访问修饰符的构造函数声明是私有的。
  2. Java7 JLS 8.9.2,如果枚举类型没有构造函数声明,则自动提供不接受参数(以匹配隐式空参数列表)的私有构造函数。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-11 12:56:38

从何时枚举构造函数的默认访问修饰符是“私有”?

一直都是。你不能再做新的了,这就是问题所在。您不能使用enum的非私有构造函数(使用来自openjdk16的javac ):

代码语言:javascript
复制
> 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上运行)。

代码语言:javascript
复制
> java -jar javac6.jar -bootclasspath openjdk6-rt.jar Test.java
Test.java:3: error: modifier public not allowed here

所以,这个错误已经有20年没有改变了。

让我们检查一下javac6中的访问级别!

代码语言:javascript
复制
> 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

因此,私人。一直都是,将来也是。就像问:“圆圈有没有拐角?”

答案是:不。永远不要。如果一个圆圈有一个角落,它就不再是一个角落了。带有公共构造函数的枚举不是enum。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67487069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档