В чем разница между `Enum.name()` и `Enum.toString()`?

После прочтения документации String java.lang.Enum.name() я не уверен, что я понимаю, когда следует использовать name() и когда использовать toString().

Возвращает имя этой константы перечисления, точно так же, как указано в объявлении перечисления. Большинство программистов должны использовать метод toString, предпочитая это, так как метод toString может возвращать более удобное имя. Этот метод предназначен в первую очередь для использования в специализированных ситуациях, где правильность зависит от получения точного имени, которое не будет отличаться от выпуска к выпуску.

В частности, хотя в документации говорится, что предпочитает toString(), собственный StandardLocation Java использует name, когда я буду иметь подумал, что в документации указано иное.

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

Кроме того, Enum реализует toString() как,

public String toString() {
    return name;
}

и я не могу представить себе ситуацию, когда пользовательское перечисление переписывает toString(), поэтому name() и toString() почти всегда одинаковы.

  • Не могли бы вы объяснить, почему игнорирование документации и использование name() - плохая идея?
  • Как насчет фразы "не будет отличаться от выпуска к выпуску". Если имя не изменится, означает ли это, что java.lang.Enum.toString() будет?

Ответ 1

Основное различие между 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() возвращает "Понедельник".

WeekDay.valueOf(WeekDay.MONDAY.name()) возвращает WeekDay.MONDAY, но WeekDay.valueOf(WeekDay.MONDAY.toString()) выбрасывает IllegalArgumentException.

Ответ 2

Используйте toString(), когда вы хотите представить информацию пользователю (включая разработчика, просматривающего журнал). Никогда не полагайтесь в своем коде на toString() дающую конкретное значение. Никогда не проверяйте это против определенной строки. Если ваш код ломается, когда кто-то корректно изменяет возврат toString(), то он уже сломан.

Если вам нужно получить точное имя, используемое для объявления константы enum, вам следует использовать name(), поскольку toString может быть переопределено.

Ответ 3

Используйте toString когда вам нужно отобразить имя для пользователя.

Используйте name когда вам нужно имя для самой вашей программы, например, чтобы определить и различить различные значения enum.