‘ Enum.name ()’和‘ Enum.toString ()’的区别是什么?

在阅读了 String java.lang.Enum.name()的文档之后,我不确定我是否理解了什么时候使用 姓名()和什么时候使用 ToString ()

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

特别是,尽管文档说更喜欢 toString(),但 Java 自己的 标准位置枚举使用 name,而我认为文档建议使用 name

public String getName() { return name(); }

此外,Enum实现 toString()作为,

public String toString() {
return name;
}

我想不出一种情况,用户定义的枚举会覆盖 toString(),因此 name()toString()几乎总是完全相同的。

  1. 您能解释一下为什么忽略文档而总是使用 name()是一个坏主意吗?
  2. “不会因为发布而改变”这句话怎么样。如果名称不会改变,是否意味着 java.lang.Enum.toString()会?
163756 次浏览

当需要向用户显示名称时,请使用 toString

当您需要 你的程序本身的名称时,使用 name,例如,识别和区分不同的枚举值。

当您希望向用户(包括查看日志的开发人员)显示信息时,请使用 ToString ()。永远不要依赖 toString()给出一个特定的值。永远不要针对特定的字符串测试它。如果当有人正确地更改 toString()返回值时,您的代码中断,那么它已经中断了。

如果需要获取声明枚举常数所用的确切名称,则应使用 姓名(),因为 toString可能已被重写。

name()toString()之间的主要区别在于,name()final方法,因此不能重写它。toString()方法返回的值与 name()默认情况下返回的值相同,但是 toString()可以被 Enum 的子类重写。

因此,如果你需要 字段本身的名称,使用 name()。如果你需要 字段值的字符串表示形式,使用 toString()

例如:

public enum WeekDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;


public String toString() {
return name().charAt(0) + name().substring(1).toLowerCase();
}
}

在这个例子中, WeekDay.MONDAY.name()返回“ MONDAY”,以及 WeekDay.MONDAY.toString()返回“星期一”。

WeekDay.valueOf(WeekDay.MONDAY.name())返回 WeekDay.MONDAY,但 WeekDay.valueOf(WeekDay.MONDAY.toString())抛出 IllegalArgumentException