Java:枚举values()和valueOf(String)

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

我的意思是,如果我有一些像这样的枚举

 enum FooEnum {ONE, TWO} 

javac在编译时将values()valueOf(String)FooEnum 。 我觉得有点奇怪。 这背后的原因是什么?

是否只是为了确保返回值/值的类型安全性还是还有其他什么? 如果只是为了类型安全,那么Generics不会有帮助吗?

它们是静态方法 – 如何将它们添加到Enum ? 静态方法不是多态的。 另外,在您提出的方案中, Enum的实现情况如何? Enum本身并不知道价值 – 只有具体类型才有。

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

这使class级自成一体。

将它们添加到Enum类本身不是更好吗?

编译器无法执行此操作,因为已经编译了Enum类,并且在任何情况下您可能都不使用相同的副本。

这可以在运行时完成,但是你增加了复杂性,例如它使得卸载类更难以获得很少的收益。

这背后的原因是什么?

没有比这更好的地方了。

注意: Enum.valueOf(clazz, name)调用clazz.valueOf(name); 因为调用clazz.valueOf(clazz, name);没有任何意义clazz.valueOf(clazz, name); (虽然你可以,如果你想混淆人们)