Если вы посмотрите в enum api на метод, name()
он говорит, что:
Возвращает имя этой константы перечисления, в точности как объявлено в объявлении перечисления. Большинство программистов должны использовать метод toString вместо этого, поскольку метод toString может возвращать более удобное для пользователя имя. Этот метод предназначен в первую очередь для использования в специализированных ситуациях, где правильность зависит от получения точного имени, которое не будет меняться от выпуска к выпуску.
Почему лучше использовать toString()
? Я имею в виду, что toString может быть переопределено, когда name () уже окончательно. Так что, если вы используете toString, и кто-то переопределяет его, чтобы вернуть жестко запрограммированное значение, все ваше приложение не работает ... Также, если вы посмотрите в исходных текстах, метод toString () возвращает точно и только имя. Это то же самое.
toString()
в своем перечислении, но никто другой не может расширить и переопределить его. Вы не можете расширять перечисления.Ответы:
Это действительно зависит от того, что вы хотите сделать с возвращаемым значением:
name()
как,toString
возможно, было переопределеноtoString
что могло быть переопределено (или нет!).Когда я чувствую, что это может сбить с толку, я предоставляю более конкретный
getXXX
метод, например:источник
Используйте,
name()
если вы хотите сделать сравнение или использовать жестко закодированное значение для внутреннего использования в вашем коде.Используется,
toString()
когда вы хотите представить информацию пользователю (включая разработчика, просматривающего журнал). Никогда не полагайтесь в своем коде наtoString()
конкретное значение. Никогда не проверяйте это против определенной строки. Если ваш код ломается, когда кто-то корректно меняетtoString()
возврат, значит, он уже сломан.От Javadoc (выделение мое):
источник
name()
это «встроенный» методenum
. Это является окончательным, и вы не можете изменить его реализацию. Возвращает имя константы enum в том виде, как оно написано, например, в верхнем регистре, без пробелов и т. Д.Сравните
MOBILE_PHONE_NUMBER
иMobile phone number
. Какая версия более читабельна? Я верю второму. В этом разница:name()
всегда возвращаетсяMOBILE_PHONE_NUMBER
,toString()
может быть переопределена для возвратаMobile phone number
.источник
Mobile phone number
только если вы переопределите его, чтобы вернуть такое значение. В противном случае он вернетсяMOBILE_PHONE_NUMBER
toString()
. Подвох в том, чтоname()
его нельзя переопределить, так как он окончательный.Хотя большинство людей слепо следуют советам javadoc, есть очень специфические ситуации, когда вы хотите избежать toString (). Например, я использую перечисления в своем коде Java, но они должны быть сериализованы в базу данных и обратно. Если бы я использовал toString (), то технически я был бы подвержен переопределенному поведению, как указывали другие.
Кроме того, можно также десериализовать из базы данных, например, это всегда должно работать в Java:
MyEnum taco = MyEnum.valueOf(MyEnum.TACO.name());
Принимая во внимание, что это не гарантируется:
MyEnum taco = MyEnum.valueOf(MyEnum.TACO.toString());
Кстати, для Javadoc было бы очень странно прямо сказать «большинство программистов должны». Я нахожу очень маленький вариант использования в toString перечисления, если люди используют его для «дружественного имени», которое явно плохой вариант использования, поскольку они должны использовать что-то более совместимое с i18n, что в большинстве случаев используйте метод name ().
источник
Практический пример, когда name () и toString () имеют смысл различаться, - это шаблон, в котором однозначное перечисление используется для определения синглтона. Поначалу это выглядит удивительно, но имеет большой смысл:
В таком случае:
источник
name () - это буквально текстовое имя в java-коде перечисления. Это означает, что он ограничен строками, которые могут фактически появляться в вашем Java-коде, но не все желаемые строки могут быть выражены в коде. Например, вам может понадобиться строка, которая начинается с цифры. name () никогда не сможет получить эту строку для вас.
источник
Вы также можете использовать что-то вроде кода ниже. Я использовал lombok, чтобы избежать написания некоторых шаблонных кодов для геттеров и конструкторов.
источник