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

2022-08-31 06:47:32

在阅读了文档之后,我不确定我是否理解何时使用name()以及何时使用toString()。String java.lang.Enum.name()

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

特别是,尽管文档说更喜欢,但Java自己的StandardLocation枚举使用,而我本来认为文档建议不是这样。toString()name

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

此外,实现为,EnumtoString()

public String toString() {
    return name;
}

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

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

答案 1

和 之间的主要区别在于这是一种方法,因此无法覆盖。该方法返回的值与默认情况下相同的值,但可以被 Enum 的子类覆盖。name()toString()name()finaltoString()name()toString()

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

例如:

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

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

在此示例中,返回“MONDAY”,并返回“Monday”。WeekDay.MONDAY.name()WeekDay.MONDAY.toString()

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


答案 2

当您想要向用户(包括查看日志的开发人员)呈现信息时,请使用 toString()。永远不要依赖代码提供特定值。切勿针对特定字符串对其进行测试。如果您的代码在有人正确更改回车符时中断,则代码已经损坏。toString()toString()

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