Enum構造函數必須是private或package默認值,並且不允許使用protected或public access修飾符。爲什麼如此爲什麼Enum構造函數不能具有受保護或公共訪問修飾符
回答
一個枚舉類型必須是包私人或私人的訪問構造函數。它會自動創建在枚舉主體開始處定義的常量。你不能自己調用一個枚舉構造函數。
能夠創建枚舉的新實例是沒有意義的,所以語言阻止你這麼做!
不,他們喜歡接口,但特殊的接口 – 2012-07-11 14:59:20
@MarkBakker:枚舉就像接口? – 2012-07-11 14:59:47
Well Enums是靜態最終字符串的替代品。我的意思是它們就像接口,你不能啓動接口或枚舉。 – 2012-07-11 15:03:50
枚舉並不意味着被實例化(由你)。
http://docs.oracle.com/javase/tutorial/reflect/special/enumTrouble.html:
提示:這是一個編譯時錯誤,試圖明確實例化一個枚舉,因爲這會阻止定義枚舉被獨特 常數。這個限制也在 反射代碼中執行。嘗試使用其默認構造函數實例化類的代碼應首先調用Class.isEnum()至 ,以確定該類是否爲枚舉。
這絕對是要實例化。雖然不是來自枚舉的外部,而只是固定的次數。 – 2012-07-11 15:10:58
@ JBNizet-你如何實例化枚舉,並確定了多少次? – nanosoft 2017-06-21 13:56:13
因爲根據定義,枚舉具有一組固定的實例,這些實例在枚舉本身中聲明和構造。因此,從枚舉類之外使用構造函數本身沒有任何意義。
而AFAIK,一個枚舉構造函數總是顯式或隱式地爲private。
你不能動態地擴展枚舉的原因是,實例化的值被編譯成字節碼的Class對象:
public T[] getEnumConstants()
Returns the elements of this enum class or null if this Class object does not
represent an enum type.
因此,任何試圖建立一個新的實例不會能夠傳遞到實際的類,因爲Class對象不能被改變。如果你想要這種行爲,你必須自己模擬它,給它一些獨特的值來表示每一個值,然後有一個序數計數器,最後是一個靜態地圖(或其他結構)來保存所有的值。
public class MyEnum {
private static AtomicInteger nextOrdinal = new AtomicInteger(0);
private static Map<Integer, MyEnum> instances =
new HashMap<Integer, MyEnum>();
private int ordinal;
private String name;
public MyEnum(String name) {
super();
this.ordinal = nextOrdinal.incrementAndGet();
this.name = name;
instances.put(Integer.valueOf(this.ordinal), this);
}
public String name() {
return name;
}
public int ordinal() {
return ordinal;
}
public static Set<MyEnum> getEnumConstants() {
return Collections.unmodifiableSet(instances.values());
}
public static MyEnum fromInt(int ordinal) {
return instances.get(Integer.valueOf(ordinal));
}
public static MyEnum fromString(String name) {
for (MyEnum val : instances.values()) {
if (val.name().equals(name)) {
return val;
}
}
return null;
}
}
你可能還需要一個.equals和.hashcode方法,以及防止同一個名字被多次使用(你可以做在構造函數,如果你拋出IllegalStateException什麼有一個重複的名字)。
- 1. Java:爲什麼構造函數具有訪問修飾符?
- 2. 爲什麼類或接口不能接收私有或受保護的訪問修飾符?
- 3. 什麼是顯式構造函數訪問修飾符?
- 4. 什麼是默認的構造函數訪問修飾符?
- 5. 保護訪問修飾符
- 6. 儘管使用公共訪問修飾符,隱形構造函數?
- 7. 公共構造不帶任何修飾
- 8. Android:爲什麼Color類具有公共構造函數?
- 9. 公共和私人訪問修飾符
- 10. 在一個類中具有不同訪問修飾符的兩個構造函數。有什麼用?
- 11. 爲什麼std :: ostream的構造函數受到保護?
- 12. Typescript中公共類訪問修飾符的用途是什麼?
- 13. 如何才能獲得java類的受保護和公共構造函數?
- 14. python中的私有公共受保護訪問說明符
- 15. 爪哇 - 保護的訪問修飾符
- 16. 訪問修飾符:私人與保護
- 17. 您應該在Ruby中使用私有,受保護和公共修飾符嗎?
- 18. 爲什麼私人,靜態,受保護的訪問修飾符不能用於類?
- 19. 爲什麼抽象類的構造函數應該受到保護,而不是公共的?
- 20. 當我需要使用受保護的訪問修飾符
- 21. java中缺省構造函數的訪問修飾符是什麼?
- 22. 無法訪問抽象類中受保護的構造函數
- 23. IllegalAccessException ..不能訪問修飾符「保護」類的成員
- 24. 繼承構造函數的默認訪問修飾符
- 25. oop php構造函數訪問修飾符,使用哪一個?
- 26. C++ 11繼承構造函數和訪問修飾符
- 27. 抽象類:單構造函數,訪問修飾符?
- 28. C++構造函數,繼承,訪問修飾符和東西
- 29. 具有受保護構造函數的單例類
- 30. 受保護的內部構造函數
爲什麼 - 如果你能(而你不能) - 你想從其定義之外構造枚舉嗎? – 2012-07-11 14:58:44