2011-10-12 104 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

相關問題