由于枚举构造函数只能由其常量调用,为什么它随后被允许为包私有?为什么枚举可以包含私有构造函数?
回答
构造函数实际上并不是包私有的......它隐含地暗示了private
接口方法隐含的方式public
即使您没有添加关键字。
的JLS(§8.8.3)的有关条文规定:
If no access modifier is specified for the constructor of a normal class, the constructor has default access.
If no access modifier is specified for the constructor of an enum type, the constructor is
private
.It is a compile-time error if the constructor of an enum type (§8.9) is declared
public
orprotected
.
引用:http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8.3 –
@Ryan Stewart:谢谢你的发现。 – ColinD
这是语言的怪癖:枚举构造函数是隐式私有。
有趣的是,如果你声明一个包,可见枚举的构造函数,像这样:
public enum MyEnum {
A(0),
B(1);
private final int i;
MyEnum(int i) {
this.i = i;
}
public int getI() {
return i;
}
}
您不能引用它从另一个类在包中。如果你尝试,你得到的编译器错误:
Cannot instantiate the type MyEnum
显然你可以用enum作为静态嵌套类或枚举的方法来试试这个。是的,编译失败,出现上述错误。 – Vlasec
“如果你声明一个包可见的枚举构造函数”......但实际上没有办法做到这一点。 – raghavsood33
@ raghavsood33是的,你可以。查看我添加到我的答案中的可编译代码,演示了一个包可见的构造函数。 – Bohemian
- 1. 为什么枚举包括可枚举
- 2. 为什么Java中的枚举中的构造函数只能被声明为私有的?
- 3. 为什么我可以从全局范围调用私有构造函数?
- 4. 私人枚举与公共重载构造函数
- 5. Java枚举构造函数错误
- 6. Java枚举与枚举在构造函数
- 7. 为什么枚举不能用作此向量构造函数中的参数?
- 8. 函数构造函数是否可以包含非此变量?
- 9. 为什么枚举转换成函数?
- 10. 通过枚举值构造initializer_list包含随机值
- 11. 为什么选择新实例只能在枚举上构造?
- 12. 为什么私人构造函数阻止对象创建C++
- 13. 为什么我们需要一个私人构造函数?
- 14. 为什么可以将枚举作为函数变量传递,但不返回枚举?
- 15. C#中私有构造函数的需求是什么?
- 16. 我如何使构造函数没有带枚举的字段?
- 17. typedef结构和枚举,为什么?
- 18. Verilog中的哪些构造可以包含函数?
- 19. 为什么在包含类的构造函数之前调用静态成员的构造函数?
- 20. 是否可以将非枚举值作为枚举函数参数传递?
- 21. 为什么Inet * Address类没有可见的构造函数?
- 22. C++复制构造函数的结构与枚举的签名
- 23. 我继承了使用私人的构造函数,为什么我仍然可以从主函数访问它?
- 24. 为什么Java枚举不可克隆?
- 25. 错误:构造函数是私有
- 26. JsonSerializationException类型与私有构造函数
- 27. 定义私有类的构造函数
- 28. CallInst构造函数是私有的?
- 29. Java Spring bean与私有构造函数
- 30. KScenemer在Lucene有私人构造函数
允许以节省代码空间一点,以避免不必要的冗长(如接口不每个方法之前需要'公共abstract') –
@ratchetfreak:这是不喜欢界面。接口方法*总是*'公共抽象'。允许显式修饰符,但是没有办法改变它们。 –
@RyanStewart也没有办法自己调用一个枚举构造函数,所以它变得逻辑上是私有的,并允许包私有允许保存这几个字符 –