我真的明白,它不能擴展任何類來實現一個枚舉,因爲這意味着有多重繼承。但是我不明白的是,爲什麼編譯器在使用「enum」而不是「class」時創建的枚舉類是最終的。爲什麼編譯器在Java中最終生成枚舉?
爲什麼枚舉不能被擴展?
另外:有沒有什麼辦法可以實現不同枚舉的常見行爲,而不需要複製& Paste?
我真的明白,它不能擴展任何類來實現一個枚舉,因爲這意味着有多重繼承。但是我不明白的是,爲什麼編譯器在使用「enum」而不是「class」時創建的枚舉類是最終的。爲什麼編譯器在Java中最終生成枚舉?
爲什麼枚舉不能被擴展?
另外:有沒有什麼辦法可以實現不同枚舉的常見行爲,而不需要複製& Paste?
A 非常枚舉的一個重要方面是,編譯時(至少在枚舉的編譯時)已知數或值。
所以,如果你有一個這樣的枚舉:
public enum Foo {
BAR,
BAZ;
}
那麼你知道它有正好兩個值:BAR
和BAZ
。
如果你可能擴展一個枚舉,那麼你可以引入一個ExtendedFoo
枚舉,增加QUUX
。現在因爲ExtendedFoo
將爲Foo
,QUUX
會突然變爲有效的Foo
值。沒有什麼會阻止你添加的任何數值的額外Foo
值。
這意味着編譯器不能再檢查您的switch
是否涵蓋所有Foo
個案。類似的靜態分析步驟也不再可能。實際上,您的enum
將不再是特殊類型,並且會有幾乎沒有差別到具有某些預定義實例的普通類。
附註:生成的enum
類是not alwaysfinal
:如果你的枚舉值(至少)一個具有特定值體,那麼「基地」類將不是最終的,但是編譯器會仍阻止您對其進行擴展。
通常的方法是創建幾個枚舉並通過實現一個通用接口來加入它們。
public enum One implements MyInterface {
}
public enum Two implements MyInterface {
}
public void process(MyInterface oneOrTwo) {
...
}
這不是我正在尋找的,因爲任何類都可以實現MyInterface,所以我需要檢查該類是否也是Enum的實例。 另外:使用接口不會幫助我不使用複製和粘貼的實現... – Hannes
由於enums
是完全不同的,在邏輯上,從classes
。您使用enums
將事物分組在一起,而不是邏輯。使用邏輯和枚舉類...以及枚舉。
你想擴展什麼枚舉?爲什麼要這麼做?如果有理由這樣做,那意味着你的結構更適合成爲一個班級。
假設我想使用枚舉來指定有效的輸入參數。除了在例如switch語句中使用枚舉之外,我還想添加一些附加功能,這些功能返回給我一個任何參數的字符串(用於設置參數的字符串,添加某個前綴...) 。 – Hannes
具有價值的部分讓我感覺到,毫無疑問。也許我會真的使用界面的方式... – Hannes