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

时间:2012-10-03 07:35:09

标签: java enums

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

我的意思是,如果我有一些像

这样的枚举
enum FooEnum {ONE, TWO}

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

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

2 个答案:

答案 0 :(得分:6)

他们是静态方法 - 如何将它们添加到Enum?静态方法不是多态的。此外,在您提议的方案中,Enum中的实施情况会如何? Enum本身并不知道这些值 - 只有具体类型才知道。

答案 1 :(得分:6)

  

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

这样可以让班级自成一体。

  

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

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

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

  

这背后的原因是什么?

没有比这更好的地方了。

注意:Enum.valueOf(clazz, name)调用clazz.valueOf(name);,因为调用clazz.valueOf(clazz, name);没有任何意义(尽管如果你想让人混淆,你可以这样做)