为什么编译器生成的枚举是Java final?
我确实理解,它不能扩展任何类来实现枚举,因为这意味着要有多重继承。但我不明白的是,为什么编译器在使用“enum”而不是“class”时创建的enum类是最终的 有什么理由不能扩展枚举吗为什么编译器生成的枚举是Java final?,java,enums,Java,Enums,我确实理解,它不能扩展任何类来实现枚举,因为这意味着要有多重继承。但我不明白的是,为什么编译器在使用“enum”而不是“class”时创建的enum类是最终的 有什么理由不能扩展枚举吗 另外:有没有办法在不复制和粘贴的情况下实现不同枚举的通用行为?常用的方法是创建多个枚举,并通过实现一个通用接口将它们连接起来 public enum One implements MyInterface { } public enum Two implements MyInterface { } publ
另外:有没有办法在不复制和粘贴的情况下实现不同枚举的通用行为?常用的方法是创建多个枚举,并通过实现一个通用接口将它们连接起来
public enum One implements MyInterface {
}
public enum Two implements MyInterface {
}
public void process(MyInterface oneOrTwo) {
...
}
因为
枚举
在逻辑上与类
完全不同。您使用enum
将事物分组在一起,而不是为了逻辑。将类用于逻辑和枚举。。。好。。。用于枚举
您要扩展哪个枚举?你为什么要那样做?如果这样做是有原因的,那就意味着你的结构更适合作为一个类。枚举的一个非常重要的方面是在编译时(至少在枚举的编译时)知道一个或多个值
因此,如果您有这样一个枚举:
public enum Foo {
BAR,
BAZ;
}
然后您知道它有两个值:BAR
和BAZ
如果可以扩展枚举,那么可以引入一个ExtendedFoo
enum,它添加qux
。现在由于ExtendedFoo
将是Foo
,qux
将突然成为有效的Foo
值。没有什么能阻止您添加任何数量的附加Foo
值
这意味着编译器无法再检查开关是否覆盖了所有Foo
案例。类似的静态分析步骤也不再可能。实际上,您的enum
将不再是一种特殊类型,并且与具有一些预定义实例的普通类几乎没有区别
旁注:生成的enum
类是:如果(至少)您的一个enum值具有特定于值的主体,那么“基类”将不是最终类,但编译器仍会阻止您扩展它。这并不是我想要的,因为任何类都可以实现MyInterface,所以我需要检查该类是否也是Enum的实例。另外:使用接口不会帮助我在实现中不使用复制和粘贴…假设我想使用枚举来指定有效的输入参数。除了在例如switch语句中使用enum之外,我还想添加一些附加功能,为任何参数返回一个特定的字符串(用于设置参数的字符串,添加一个特定的前缀,…)。毫无疑问,带有值的部分对我来说是有意义的。也许我真的应该用界面的方式。。。