В чем разница между `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.