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

use*_*379 3 java enums anti-patterns

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

例如,

public enum Example1 {FOO, BAR}
Run Code Online (Sandbox Code Playgroud)

重构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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*ser 5

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

  • valueOf直接耦合到名称,name()和valueOf()都不能被覆盖,因此:yes.另一方面,toString可以被覆盖并用于显示枚举的附加信息/字段. (2认同)