我真的明白它无法扩展任何类来实现枚举,因为这意味着有多重继承。但我不明白的是,为什么编译器在使用“enum”而不是“class”时创建的枚举类是最终的。
有没有什么理由不能延长枚举?
Plus:有没有办法在不使用Copy& Paste?
的情况下对不同的枚举实现常见行为答案 0 :(得分:4)
枚举的非常重要方面是数字或值在编译时是已知的(至少在枚举的编译时)。
所以如果你有这样的枚举:
public enum Foo {
BAR,
BAZ;
}
然后您知道它有完全两个值:BAR
和BAZ
。
如果你可以扩展枚举,那么你可以引入一个ExtendedFoo
枚举,添加QUUX
。现在,由于ExtendedFoo
为Foo
,QUUX
突然变为有效的Foo
值。没有什么能阻止你添加任何数量的额外Foo
值。
这意味着编译器无法再检查switch
是否涵盖所有Foo
个案例。类似的静态分析步骤也不再可能。实际上,您的enum
将不再是特殊类型,并且与正常类相比,与之间的差异很小。
旁注:生成的enum
类为not always final
:如果(至少)您的一个枚举值具有特定于值的正文,那么“基础”类将不< / em>是final,但编译器仍然阻止你扩展它。
答案 1 :(得分:2)
常见的方法是创建几个枚举并通过实现一个通用接口来加入它们。
public enum One implements MyInterface {
}
public enum Two implements MyInterface {
}
public void process(MyInterface oneOrTwo) {
...
}
答案 2 :(得分:1)
因为enums
在逻辑上与classes
完全不同。您可以使用enums
将事物分组,而不是逻辑分组。使用类来表示逻辑和枚举......好吧......用于枚举。
你想扩展什么枚举?为什么要这么做?如果有理由这样做,那意味着你的结构更适合成为一个班级。