6

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

我的意思是,如果我有一些枚举,例如

enum FooEnum {ONE, TWO}

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

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

4

2 回答 2

6

它们是静态方法——它们是如何被添加到的Enum?静态方法不是多态的。Enum此外,在您提出的方案中,实施会是什么样子?Enum本身不知道值 - 只有具体类型知道。

于 2012-10-03T07:37:20.597 回答
6

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

这使类保持自包含。

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

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

这可以在运行时完成,但是您会增加复杂性,例如,它会使卸载类变得更加困难而收益甚微。

这背后的原因是什么?

没有比这更好的地方了。

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

于 2012-10-03T07:38:14.720 回答