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

问题

如果你看一下方法name()的enum api说:

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

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


#1 热门回答(169 赞)

这实际上取决于你想要对返回值做什么:

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

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

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 热门回答(45 赞)

如果要进行比较或使用硬编码值进行代码中的某些内部使用,请使用name()

当你想要向用户显示信息时(包括查看日志的开发人员),请使用toString()。永远不要依赖于代码toString()以获得特定值。切勿针对特定字符串进行测试。如果你的代码在有人正确更改toString()返回时中断了,那么它已经被破坏了。

来自javadoc(强调我的):

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


#3 热门回答(21 赞)

name()enum的"内置"方法。这是最终的,你不能改变它的实现。它在写入时返回枚举常量的名称,例如:大写字母,没有空格等

CompareMOBILE_PHONE_NUMBERandMobile phone number。哪个版本更具可读性?我相信第二个。这是区别:name()always returnMOBILE_PHONE_NUMBER,toString()可以覆盖returnMobile phone number