`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()
几乎总是一模一样。
- 你能解释为什么忽略文档,总是使用
name()
是一个坏主意? - 那么“从发布到发布不会有所不同”这个词呢? 如果名称不会改变,是否意味着
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
,例如识别和区分不同的枚举。