由於枚舉構造函數只能由其常量調用,爲什麼它隨後被允許爲包私有?爲什麼枚舉可以包含私有構造函數?
回答
構造函數實際上並不是包私有的......它隱含地暗示了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. 爲什麼枚舉包括可枚舉
- 3. 可以枚舉包含其他枚舉?
- 4. Java枚舉器中的私有構造函數
- 5. 爲什麼Java中的枚舉中的構造函數只能被聲明爲私有的?
- 6. 爲什麼我可以從全局範圍調用私有構造函數?
- 7. Java枚舉私人方法在項目的構造函數
- 8. 私人枚舉與公共重載構造函數
- 9. 爲什麼有一個私有構造
- 10. 如何指定枚舉構造函數
- 11. Java枚舉構造函數錯誤
- 12. 何時調用枚舉構造函數?
- 13. Java枚舉與枚舉在構造函數
- 14. 爲什麼我們需要一個私有構造函數?
- 15. 爲什麼枚舉不能用作此向量構造函數中的參數?
- 16. Javascript爲什麼在IIFE中包含變量或構造函數?
- 17. 函數構造函數是否可以包含非此變量?
- 18. 爲什麼枚舉轉換成函數?
- 19. 爲什麼枚舉構造函數不能訪問靜態字段
- 20. 枚舉AppMessage構造
- 21. 鑄造爲可空枚舉
- 22. 爲什麼System.Data.SqlClient.SqlDataReader沒有構造函數
- 23. 一個類可以有公共和私有構造函數嗎?
- 24. 什麼時候使用私有構造函數有用?
- 25. Linq包含枚舉數組
- 26. 爲什麼選擇新實例只能在枚舉上構造?
- 27. 以私有類實例作爲構造函數參數
- 28. 爲什麼我無法從私有類中的參數化構造函數調用默認構造函數?
- 29. 通過枚舉值構造initializer_list包含隨機值
- 30. 爲什麼可以將枚舉作爲函數變量傳遞,但不返回枚舉?
允許以節省代碼空間一點,以避免不必要的冗長(如接口不每個方法之前需要'公共abstract') –
@ratchetfreak:這是不喜歡界面。接口方法*總是*'公共抽象'。允許顯式修飾符,但是沒有辦法改變它們。 –
@RyanStewart也沒有辦法自己調用一個枚舉構造函數,所以它變得邏輯上是私有的,並允許包私有允許保存這幾個字符 –