Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么编译器生成的枚举是Java final?_Java_Enums - Fatal编程技术网

为什么编译器生成的枚举是Java final?

为什么编译器生成的枚举是Java final?,java,enums,Java,Enums,我确实理解,它不能扩展任何类来实现枚举,因为这意味着要有多重继承。但我不明白的是,为什么编译器在使用“enum”而不是“class”时创建的enum类是最终的 有什么理由不能扩展枚举吗 另外:有没有办法在不复制和粘贴的情况下实现不同枚举的通用行为?常用的方法是创建多个枚举,并通过实现一个通用接口将它们连接起来 public enum One implements MyInterface { } public enum Two implements MyInterface { } publ

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

有什么理由不能扩展枚举吗


另外:有没有办法在不复制和粘贴的情况下实现不同枚举的通用行为?

常用的方法是创建多个枚举,并通过实现一个通用接口将它们连接起来

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之外,我还想添加一些附加功能,为任何参数返回一个特定的字符串(用于设置参数的字符串,添加一个特定的前缀,…)。毫无疑问,带有值的部分对我来说是有意义的。也许我真的应该用界面的方式。。。