Java enum - 为什么使用 toString 而不是 name

2022-08-31 06:32:14

如果你在枚举 api 中查看方法 name() 处,它会说:

返回此枚举常量的名称,完全符合其枚举声明中声明的名称。大多数程序员应该优先使用toString方法而不是此方法,因为toString方法可能会返回一个更加用户友好的名称。此方法主要用于特殊情况,其中正确性取决于获取确切名称,而该名称不会因版本而异。

为什么使用更好?我的意思是,当 name() 已经是 final 时,toString 可能会被覆盖。因此,如果您使用toString并且有人覆盖它以返回硬编码值,则整个应用程序都已关闭...此外,如果您查看源代码,toString() 方法将准确返回,并且仅返回名称。这是一回事。toString()


答案 1

这实际上取决于您要对返回值执行的操作:

  • 如果需要获取用于声明枚举常量的确切名称,则应使用可能已被覆盖的name()toString
  • 如果要以用户友好的方式打印枚举常量,则应使用可能已被覆盖(或未覆盖)的枚举常量。toString

当我觉得它可能令人困惑时,我会提供一个更具体的方法,例如:getXXX

public enum Fields {
    LAST_NAME("Last Name"), FIRST_NAME("First Name");

    private final String fieldDescription;

    private Fields(String value) {
        fieldDescription = value;
    }

    public String getFieldDescription() {
        return fieldDescription;
    }
}

答案 2

当您想要进行比较或使用硬编码值在代码中的某些内部用途时使用。name()

当您要向用户(包括查看日志的开发人员)呈现信息时使用。永远不要依赖代码提供特定值。切勿针对特定字符串对其进行测试。如果您的代码在有人正确更改回车符时中断,则代码已经损坏。toString()toString()toString()

来自javadoc(强调我的):

返回对象的字符串表示形式。通常,toString 方法返回一个“文本表示”此对象的字符串。结果应该是一个简洁但信息丰富的表示,易于一个人阅读建议所有子类重写此方法。