问题
如果你看一下方法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_NUMBER
andMobile phone number
。哪个版本更具可读性?我相信第二个。这是区别:name()
always returnMOBILE_PHONE_NUMBER
,toString()
可以覆盖returnMobile phone number
。