【问题标题】:Java: enum values() and valueOf(String)Java:枚举值()和 valueOf(字符串)
【发布时间】:2012-10-03 07:35:08
【问题描述】:

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

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

enum FooEnum {ONE, TWO}

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

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

【问题讨论】:

    标签: java enums


    【解决方案1】:

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

    【讨论】:

    • PL.见上面的评论。此外,“Class”定义了一个“enumConstantDirectory”实例变量。那么这两种方法不能复用吗?
    • 例如,在 Enum 中定义一个实例数组字段,并用它来存储子类 Enums。当然,相应的方法将需要是实例级别的,但子类现在可以重用该超类代码。
    • @shrini1000:“当然,相应的方法需要是实例级别的”——这肯定会破坏整个观点。如果我试图获取一个实例,我可能没有拥有一个实例。这不是逻辑上每个实例的操作。
    • 好的,我明白了。方法必须是静态的,因为它们是 util 方法,我们不能有一个静态数组,因为那样它将被所有子类共享,这几乎不是我们想要的。
    【解决方案2】:

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

    这样可以保持类自包含。

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

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

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

    这背后的原因是什么?

    没有比这更好的地方了。

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

    【讨论】:

    • Enum 类已经有一个方法 'valueOf(Class enumType, String name)'。那么这两个其他方法不能也这样定义,可能返回 T[] 和 T?
    • Enum.valueOf(clazz, name) 调用 clazz.valueOf(name); 因此它们的定义相同,删除了冗余参数。由于第一个方法是静态的,它不能被覆盖,所以它不可能改变它的行为。
    猜你喜欢
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    相关资源
    最近更新 更多