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

shr*_*000 6 java enums

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

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

enum FooEnum {ONE, TWO}
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 6

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


Pet*_*rey 6

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

这使得班级自成一体.

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

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

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

这背后的原因是什么?

没有比这更好的地方了.

注意:Enum.valueOf(clazz, name)拨打电话clazz.valueOf(name);是没有任何意义的clazz.valueOf(clazz, name);(虽然你可以,如果你想混淆人们)

  • `Enum.valueOf(clazz,name)`调用`clazz.valueOf(name);`因此它们被定义为删除冗余参数.由于第一种方法是静态的,因此无法覆盖它,因此无法改变其行为. (2认同)