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