Java:enum values()和valueOf(字符串)

Java:enum values()和valueOf(字符串),java,enums,Java,Enums,为什么javac向正在定义的枚举类型添加values()和valueOf(String)方法?将它们添加到枚举类本身不是更好吗 我的意思是,如果我有一些枚举,比如 enum FooEnum {ONE, TWO} javac在编译时将values()和valueOf(String)添加到fooneum。我觉得有点奇怪。这背后的原因是什么 它只是为了确保返回值/值的类型安全,还是有其他原因?如果仅仅是为了类型安全,泛型不是有帮助吗?它们是静态方法-它们怎么会被添加到Enum?静态方法不是多态的。此

为什么javac向正在定义的枚举类型添加
values()
valueOf(String)
方法?将它们添加到枚举类本身不是更好吗

我的意思是,如果我有一些枚举,比如

enum FooEnum {ONE, TWO}
javac在编译时将
values()
valueOf(String)
添加到
fooneum
。我觉得有点奇怪。这背后的原因是什么


它只是为了确保返回值/值的类型安全,还是有其他原因?如果仅仅是为了类型安全,泛型不是有帮助吗?

它们是静态方法-它们怎么会被添加到
Enum
?静态方法不是多态的。此外,在您提议的方案中,
Enum
中的实现是什么样子的
Enum
本身不知道值-只有具体类型知道

为什么javac要将values()和valueOf(String)方法添加到正在定义的枚举类型中

这使类保持自包含

将它们添加到枚举类本身不是更好吗

编译器无法执行此操作,因为枚举类已被编译,并且在任何情况下都可能未使用同一副本

这可以在运行时完成,但会增加复杂性,例如,这会使卸载类变得更加困难,但收获甚微

这背后的原因是什么

没有比这更好的地方了


注:
Enum.valueOf(clazz,name)
calls
clazz.valueOf(name)clazz.valueOf(clazz,name)没有任何意义(如果您想让人感到困惑,可以这样做)

枚举类已经有了一个方法“valueOf(class enumType,String name)”。那么,这两个其他方法是否也可以这样定义,可能返回t[]和t?
Enum.valueOf(clazz,name)
calls
clazz.valueOf(name)
因此,删除冗余参数后,它们的定义相同。由于第一个方法是静态的,因此无法重写它,因此无法更改其behavior.Pl。见上面的评论。另外,“类”定义了一个“enumConstantDirectory”实例变量。那么,它不能被用于其他两种方法吗?例如,在Enum中定义一个实例数组字段,并使用它来存储子类Enum。当然,相应的方法需要是实例级的,但是子类现在可以重用超级类代码。@shrini1000:“当然,相应的方法需要是实例级的”——这肯定会破坏整个要点。如果我试图获得一个实例,我可能没有实例。从逻辑上讲,这不是每个实例的操作。好的,我明白了。这些方法必须是静态的,因为它们是util方法,而我们不能有一个静态数组,因为这样它将被所有子类共享,而不是我们想要的。