为什么javac会将values()
和valueOf(String)
方法添加到定义的枚举类型中?将它们添加到Enum类本身不是更好吗?
我的意思是,如果我有一些像
这样的枚举enum FooEnum {ONE, TWO}
javac在编译时将values()
和valueOf(String)
添加到FooEnum
。我觉得有点奇怪。这背后的原因是什么?
仅用于确保返回值/值的类型安全性还是还有其他什么?如果只是为了类型安全,Generics不会帮助吗?
答案 0 :(得分:6)
他们是静态方法 - 如何将它们添加到Enum
?静态方法不是多态的。此外,在您提议的方案中,Enum
中的实施情况会如何? Enum
本身并不知道这些值 - 只有具体类型才知道。
答案 1 :(得分:6)
为什么javac会将value()和valueOf(String)方法添加到正在定义的枚举类型中?
这样可以让班级自成一体。
将它们添加到Enum类本身会不会更好?
编译器无法执行此操作,因为已经编译了Enum类,并且在任何情况下您可能都没有使用相同的副本。
这可以在运行时完成但是你增加了复杂性,例如它使得卸载课程变得更加难以获得收益。
这背后的原因是什么?
没有比这更好的地方了。
注意:Enum.valueOf(clazz, name)
调用clazz.valueOf(name);
,因为调用clazz.valueOf(clazz, name);
没有任何意义(尽管如果你想让人混淆,你可以这样做)