2011-01-27 34 views
2

嘗試顯式實例化枚舉類型是一個編譯時錯誤(第15.9.1節)。 Enum中的最後一個克隆方法確保枚舉常量永遠不會被克隆,並且序列化機制的特殊處理可確保重複實例從不會因反序列化而被創建。禁止枚舉類型的反射實例化。總而言之,這四件事確保枚舉類型的實例不會超出枚舉常量定義的實例。除了在枚舉聲明中有更多的枚舉類型實例有什麼缺點?

除了在枚舉 聲明中有更多的枚舉類型實例有什麼缺點?

+0

我很想知道爲什麼你想要一個以上的枚舉類型實例?一個枚舉被用來表示一組固定的常量,所以通過有一個常量的多個實例,這與想要在整數集合中有多個「數字5」相同。我的反問題是:具有多於一個枚舉類型實例的優點是什麼? – alpian 2011-01-27 12:39:34

回答

5

缺點是你拋棄了枚舉的靜態可檢查性。

您可以靜態確保枚舉值上的switch確實可以處理所有情況。您可以靜態確保使用枚舉調用方法確實是一項理智的事情。您可以靜態確保資源包中的每個枚舉值都有翻譯。還有更多的東西。

您可以確保equals()等同於具有枚舉的==

所有這些定義爲enum

如果你想要一個與枚舉類似的東西,然後寫下來:這不是太難。

2

它會破壞比較。你想

if (myEnumValue == yourEnumValue) 
{ 
} 

工作,如果有可能是相同的枚舉值的多個實例,也不能保證這樣的參考基礎的測試是可行的。與字符串比較。

+0

爲什麼我不能通過構造函數給出不同的值,而不是給出相同的值 – saravanan 2011-01-28 09:12:34

1

嗯,我想這會造成混亂,因爲人們希望能夠使用==與枚舉進行比較。能夠克隆會破壞語義。

0

如果你有兩個枚舉那麼下面的指令可能是真的還是假的......

public boolean isEnumBlack(EnumType enum) { 
    if (enum == EnumType.BLACK) { 
     return true; 
    } else { 
     return false; 
    } 
} 

然後,如果你把這種方法用在EnumType,黑色的「實例」 ......然後它會不是真的。

isEnumBlack(BLACK)會返回false,即使根據代碼它應該返回true。枚舉的將不再是枚舉的!

0

除了所有其他的好答案,它會打破EnumSet。根據枚舉的大小,將EnumSet實現爲單個longlong的數組,其中每個位表示包含或排除一個特定枚舉值。如果枚舉的數量和順序不是恆定的,這是行不通的。