`Enum.name()`和`Enum.toString()`有什么区别?

在阅读String java.lang.Enum.name()的文档后,我不确定何时使用name()以及何时使用toString() 。

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

尤其是,尽pipe文档中提供了更喜欢toString() ,但是Java自己的StandardLocation枚举使用了name当我以为文档中有其他的含义时。

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

此外, Enum实现toString() as,

 public String toString() { return name; } 

我想不出用户定义的枚举会覆盖toString()所以name()toString()几乎总是一模一样。

  1. 你能解释为什么忽略文档,总是使用name()是一个坏主意?
  2. 那么“从发布到发布不会有所不同”这个词呢? 如果名称不会改变,是否意味着java.lang.Enum.toString()会?

name()toString()之间的主要区别是name()final方法,所以它不能被覆盖。 toString()方法返回与name()默认值相同的值,但toString()可以被Enum的子类覆盖。

因此,如果您需要该字段本身名称 ,请使用name() 。 如果需要字段值的string表示forms ,请使用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()返回“Monday”。

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

当您想要向用户呈现信息(包括查看日志的开发人员时使用toString( )。 永远不要依靠toString()给出具体的值。 切勿对特定的string进行testing。 如果你的代码在有人正确地改变了toString()返回时中断了,那么它已经被破坏了。

如果您需要获取用于声明枚举常量的确切名称,则应该使用name()作为toString可能已被覆盖

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

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