阅读文档后String java.lang.Enum.name()我不确定我知道什么时候使用姓名()以及何时使用tostring()

返回该枚举常数的名称,完全按照其枚举声明中声明。大多数程序员应该使用ToString方法优先使用ToString方法,因为ToString方法可能会返回一个更友好的名称。此方法主要用于在正确性取决于获得确切名称的专业情况下使用,而该名称不会因发行而异。

特别是,即使文档表示喜欢toString(),Java自己的标准口枚举用途name当我以为文档所建议的时候。

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

此外Enum工具toString()作为,

public String toString() {
    return name;
}

我无法想象用户定义的枚举会覆盖的情况toString()所以name()toString()几乎总是完全一样。

  1. 您能否解释一下为什么忽略文档并始终使用name()是个坏主意吗?
  2. 该短语"不会因发行而异。如果名称不会有所不同,是否意味着java.lang.Enum.toString()会?

答案

主要区别name()toString()就是它name()是一个final方法,因此不能被覆盖。这toString()方法返回相同的值name()默认情况下,但是toString()可以被枚举子类覆盖。

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

例如:

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

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

在此示例中WeekDay.MONDAY.name()返回"星期一",和WeekDay.MONDAY.toString()返回"星期一"。

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

来自: stackoverflow.com