2011-11-09 31 views
3

我真的明白,它不能擴展任何類來實現一個枚舉,因爲這意味着有多重繼承。但是我不明白的是,爲什麼編譯器在使用「enum」而不是「class」時創建的枚舉類是最終的。爲什麼編譯器在Java中最終生成枚舉?

爲什麼枚舉不能被擴展?

另外:有沒有什麼辦法可以實現不同枚舉的常見行爲,而不需要複製& Paste?

回答

4

A 非常枚舉的一個重要方面是,編譯時(至少在枚舉的編譯時)已知數或值。

所以,如果你有一個這樣的枚舉:

public enum Foo { 
    BAR, 
    BAZ; 
} 

那麼你知道它有正好兩個值:BARBAZ

如果你可能擴展一個枚舉,那麼你可以引入一個ExtendedFoo枚舉,增加QUUX。現在因爲ExtendedFooFooQUUX會突然變爲有效的Foo值。沒有什麼會阻止你添加的任何數值的額外Foo值。

這意味着編譯器不能再檢查您的switch是否涵蓋所有Foo個案。類似的靜態分析步驟也不再可能。實際上,您的enum將不再是特殊類型,並且會有幾乎沒有差別到具有某些預定義實例的普通類。

附註:生成的enum類是not alwaysfinal:如果你的枚舉值(至少)一個具有特定值體,那麼「基地」類將是最終的,但是編譯器會阻止您對其進行擴展。

+0

具有價值的部分讓我感覺到,毫無疑問。也許我會真的使用界面的方式... – Hannes

2

通常的方法是創建幾個枚舉並通過實現一個通用接口來加入它們。

public enum One implements MyInterface { 

} 

public enum Two implements MyInterface { 

} 

public void process(MyInterface oneOrTwo) { 
    ... 
} 
+0

這不是我正在尋找的,因爲任何類都可以實現MyInterface,所以我需要檢查該類是否也是Enum的實例。 另外:使用接口不會幫助我不使用複製和粘貼的實現... – Hannes

1

由於enums是完全不同的,在邏輯上,從classes。您使用enums將事物分組在一起,而不是邏輯。使用邏輯和枚舉類...以及枚舉。

你想擴展什麼枚舉?爲什麼要這麼做?如果有理由這樣做,那意味着你的結構更適合成爲一個班級。

+0

假設我想使用枚舉來指定有效的輸入參數。除了在例如switch語句中使用枚舉之外,我還想添加一些附加功能,這些功能返回給我一個任何參數的字符串(用於設置參數的字符串,添加某個前綴...) 。 – Hannes