为什么编译器在Java中生成Enums?

时间:2011-11-09 08:33:47

标签: java enums

我真的明白它无法扩展任何类来实现枚举,因为这意味着有多重继承。但我不明白的是,为什么编译器在使用“enum”而不是“class”时创建的枚举类是最终的。

有没有什么理由不能延长枚举?

Plus:有没有办法在不使用Copy& Paste?

的情况下对不同的枚举实现常见行为

3 个答案:

答案 0 :(得分:4)

枚举的非常重要方面是数字或值在编译时是已知的(至少在枚举的编译时)。

所以如果你有这样的枚举:

public enum Foo {
  BAR,
  BAZ;
}

然后您知道它有完全两个值:BARBAZ

如果你可以扩展枚举,那么你可以引入一个ExtendedFoo枚举,添加QUUX。现在,由于ExtendedFoo FooQUUX突然变为有效的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将事物分组,而不是逻辑分组。使用类来表示逻辑和枚举......好吧......用于枚举。

你想扩展什么枚举?为什么要这么做?如果有理由这样做,那意味着你的结构更适合成为一个班级。