Перечисление Java - зачем использовать toString вместо имени

Если вы посмотрите в enum api на методname() это говорит о том, что:

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

Почему лучше использоватьtoString()? Я имею в виду, что toString может быть переопределено, когда name () уже окончательно. Поэтому, если вы используете toString, и кто-то переопределяет его, чтобы вернуть жестко запрограммированное значение, все ваше приложение не работает ... Также, если вы посмотрите в исходных текстах, метод toString () возвращает точно и только имя. Это'Это то же самое.

 Erick G. Hagstrom22 мар. 2016 г., 10:53
Вы можете переопределитьtoString() в вашем перечислении, но никто другой не может расширить и переопределить его. Вы можете'т расширить перечисления.

Ответы на вопрос(6)

начает, что он ограничен строками, которые могут фактически появляться в вашем Java-коде, но не все желаемые строки могут быть выражены в коде. Например, вам может понадобиться строка, которая начинается с цифры. name () никогда не сможет получить эту строку для вас.

Решение Вопроса

что вы хотите сделать с возвращаемым значением:

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

Когда я чувствую, что это может сбить с толку, я предоставляю более конкретныйgetXXX метод, например:

public enum Fields {
    LAST_NAME("Last Name"), FIRST_NAME("First Name");

    private final String fieldDescription;

    private Fields(String value) {
        fieldDescription = value;
    }

    public String getFieldDescription() {
        return fieldDescription;
    }
}
 ralphgabb25 окт. 2018 г., 08:34
Это приемлемо Хотя, если они позволят enum иметь базовый класс, все будет проще.

name() это "встроенный» методenum, Это окончательно, и вы не можете изменить его реализацию. Возвращает имя константы enum в том виде, как оно написано, например, в верхнем регистре, без пробелов и т. д.

сравнитьMOBILE_PHONE_NUMBER а такжеMobile phone number, Какая версия более читабельна? Я верю второму. Это разница:name() всегда возвращается,MOBILE_PHONE_NUMBERtoString() может быть отменено, чтобы вернуться.Mobile phone number

 artfullyContrived29 апр. 2013 г., 09:03
@AlexR вам, возможно, придется включить свой ответ в ответ, чтобы сделать его на 100% правильным
 martinatime05 мая 2014 г., 17:57
Я согласен с @artfullyContrived, поскольку это не былоДля меня это очевидно, пока я не прочитаю ваши комментарии.
 AlexR09 нояб. 2012 г., 19:51
@ Spayny, очевидно, что вы должны переопределитьtoString(), Подвох в том, чтоname() не может быть отменено, поскольку оно является окончательным.
 spauny08 нояб. 2012 г., 15:59
Это не правильно !! toString () возвращаетMobile phone number только если вы переопределите его, чтобы вернуть такое значение. В противном случае он вернетсяMOBILE_PHONE_NUMBER

name() когда вы хотите сделать сравнение или использовать жестко закодированное значение для внутреннего использования в вашем коде.

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

От Javadoc (выделение мое):

Возвращает строковое представление объекта. В общем случае метод toString возвращает строку, которая "текстуально представляет этот объект. Результатом должно быть краткое, но информативное представление, которое легкочеловек для чтения.Рекомендуется, чтобы все подклассы переопределяли этот метод.

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

Кроме того, можно также десериализовать из базы данных, например, это всегда должно работать в Java:

MyEnum taco = MyEnum.valueOf(MyEnum.TACO.name());

Принимая во внимание, что это не гарантируется:

MyEnum taco = MyEnum.valueOf(MyEnum.TACO.toString());

Кстати, я нахожу очень странным, чтобы Javadoc прямо сказал:большинство программистов должны, Я нахожу очень мало вариантов использования в toString перечисления, если люди используют это для "Дружественное имя" тот'Это явно плохой вариант использования, поскольку они должны использовать что-то более совместимое с i18n, которое в большинстве случаев будет использовать метод name ().

 spauny17 мар. 2017 г., 09:59
Спасибо за ответы. Это'Прошло почти 5 лет с тех пор, как я задал этот вопрос, и яМы еще не использовали метод toString () для перечисления! 99% случаев я использую перечисления точно для того, что вы описали: сериализацию и десериализацию имен перечислений в / из базы данных.

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

enum SingletonComponent {
    INSTANCE(/*..configuration...*/);

    /* ...behavior... */

    @Override
    String toString() {
      return "SingletonComponent"; // better than default "INSTANCE"
    }
}

В таком случае:

SingletonComponent myComponent = SingletonComponent.INSTANCE;
assertThat(myComponent.name()).isEqualTo("INSTANCE"); // blah
assertThat(myComponent.toString()).isEqualTo("SingletonComponent"); // better
 spauny12 мар. 2016 г., 20:02
Да ты'Правильно ... хороший пример - гуаваS enum Предикаты

Ваш ответ на вопрос