167

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

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

特别是,即使文档说要更喜欢toString(),Java 自己的StandardLocation枚举name在我认为文档建议的情况下使用。

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

此外Enum实现toString()为,

public String toString() {
    return name;
}

而且我想不出用户定义的枚举会覆盖toString()这种情况name()并且toString()几乎总是完全相同的情况。

  1. 您能否解释一下为什么忽略文档并始终使用name()是一个坏主意?
  2. 短语“不会因版本而异”呢?如果名称不会改变,是否意味着java.lang.Enum.toString()会改变?
4

3 回答 3

272

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()返回“Monday”。

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

于 2013-08-03T09:55:38.390 回答
32

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

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

于 2013-08-03T09:08:34.893 回答
21

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

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

于 2013-08-03T09:01:08.930 回答