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

Mic*_*ann 107 java enums

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

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

特别是,即使文档说更喜欢toString(),Java自己的StandardLocation枚举name也会在我认为文档建议不同时使用.

public String getName() { return name(); }
Run Code Online (Sandbox Code Playgroud)

另外Enum实现toString()为,

public String toString() {
    return name;
}
Run Code Online (Sandbox Code Playgroud)

我无法想到用户定义的枚举会覆盖的toString()情况name(),toString()并且几乎总是完全相同.

  1. 你能解释为什么忽略文档并总是使用name()是一个坏主意?
  2. "从发布到发布不会有所不同"这句话怎么样?如果名称不会改变,它是否暗示java.lang.Enum.toString()会这样?

Han*_*nde 187

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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


But*_*jay 18

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

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


Meh*_*dad 13

使用toString时需要显示的名字给用户.

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