什么时候可以使用Enum的名字()

问题描述 投票:3回答:3

变量的名称可以更改,不应影响逻辑。但是Enum中的name()方法返回一个常量名称作为值,因此它可以破坏现有代码。我应该避免使用name()吗?

例如,

public enum Example1 {FOO, BAR}

FOO名称重构为FOO2将制造Example1.FOO.name().equals("FOO")

public enum Example2 {
    FOO("FOO"),
    BAR("BAR");

    String code;

    private Example2(final String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }
}

在这种情况下,将FOO名称更改为FOO2将不会制造Example2.FOO.getCode().equals("FOO")

java enums anti-patterns
3个回答
5
投票
  • 业务逻辑应该使用枚举值,而不是直接使用name()。原因:即使名称发生变化,语义(与之前相同的枚举值)也保持不变。
  • 在序列化/反序列化值时使用name()。这会影响数据库(使用O / R映射的名称时),存储在文件中或通过线路传输的序列化数据(JSON / XML / YAML / ...序列化),日志条目等。 更改名称可能需要在第三方代码中进行数据迁移或调整。

2
投票

您怀疑使用它通常是不明智的,因为它泄漏了实现细节是正确的。如果你有一个带有enum值的颜色RED,那么使用colour.name()向程序用户报告某些颜色是错误的,因为用户可能需要使用非英语语言的消息,并且所有CAPS文本通常都是不合适的。

在程序员用来帮助调试问题的代码中使用它是可以的。比如异常消息,因为they should not be presented to normal program users


-2
投票

使用枚举类型时,我总是比较枚举本身而不是枚举的名称(字符串)。

Example2.FOO.equals(Example2.getEnumByName("FOO"));
© www.soinside.com 2019 - 2024. All rights reserved.