2011-10-12 123 views
44

由于枚举构造函数只能由其常量调用,为什么它随后被允许为包私有?为什么枚举可以包含私有构造函数?

+7

允许以节省代码空间一点,以避免不必要的冗长(如接口不每个方法之前需要'公共abstract') –

+0

@ratchetfreak:这是不喜欢界面。接口方法*总是*'公共抽象'。允许显式修饰符,但是没有办法改变它们。 –

+0

@RyanStewart也没有办法自己调用一个枚举构造函数,所以它变得逻辑上是私有的,并允许包私有允许保存这几个字符 –

回答

70

构造函数实际上并不是包私有的......它隐含地暗示了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 or protected .

+4

引用:http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8.3 –

+0

@Ryan Stewart:谢谢你的发现。 – ColinD

2

这是语言的怪癖:枚举构造函数是隐式私有。

有趣的是,如果你声明一个包,可见枚举的构造函数,像这样:

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

+0

显然你可以用enum作为静态嵌套类或枚举的方法来试试这个。是的,编译失败,出现上述错误。 – Vlasec

+0

“如果你声明一个包可见的枚举构造函数”......但实际上没有办法做到这一点。 – raghavsood33

+0

@ raghavsood33是的,你可以。查看我添加到我的答案中的可编译代码,演示了一个包可见的构造函数。 – Bohemian

相关问题