Как получить значение перечисления из строкового значения в Java?

Я не знаю названия, когда он имеет схему, но имя хоста с портом коллективно известно как Authority . Хорошее объяснение here .

1836
задан Steve Chambers 11 September 2018 в 14:59
поделиться

5 ответов

Да, Blah.valueOf("A") даст Вам Blah.A.

Примечание, что имя должно быть точное совпадение, включая случай: Blah.valueOf("a") и Blah.valueOf("A ") оба бросают IllegalArgumentException.

статические методы valueOf() и values() создаются во время компиляции и не появляются в исходном коде. Они действительно появляются в Javadoc, хотя; например, Dialog.ModalityType шоу оба метода.

2142
ответ дан Michael Myers 12 September 2018 в 00:59
поделиться

Лучше всего использовать Blah.valueOf (string) , но вы также можете использовать Enum.valueOf (Blah.class, string) .

]
34
ответ дан 22 November 2019 в 20:02
поделиться

Вы также должны быть осторожны со своим чемоданом. Позвольте мне объяснить: выполнение Blah.valueOf ("A") работает, но Blah.valueOf ("a") не работает. Затем снова Blah.valueOf ("a" .toUpperCase (Locale.ENGLISH)) будет работать.

edit
Изменил наUpperCase на наUpperCase (Locale.ENGLISH ) на основе tc. комментарий и java-документы

edit2 На Android вы должны использовать Locale.US , как sulai указывает .

74
ответ дан 22 November 2019 в 20:02
поделиться

Вот отличная утилита, которую я использую:

/**
 * A common method for all enums since they can't have another base class
 * @param <T> Enum type
 * @param c enum type. All enums must be all caps.
 * @param string case insensitive
 * @return corresponding enum, or null
 */
public static <T extends Enum<T>> T getEnumFromString(Class<T> c, String string) {
    if( c != null && string != null ) {
        try {
            return Enum.valueOf(c, string.trim().toUpperCase());
        } catch(IllegalArgumentException ex) {
        }
    }
    return null;
}

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

public static MyEnum fromString(String name) {
    return getEnumFromString(MyEnum.class, name);
}

Если ваши перечисления не все заглавные, просто измените Строка Enum.valueOf .

Жаль, что я не могу использовать T.class для Enum.valueOf , поскольку T стирается.

118
ответ дан 22 November 2019 в 20:02
поделиться

Другое решение, если текст не совпадает со значением перечисления:

public enum Blah {
    A("text1"),
    B("text2"),
    C("text3"),
    D("text4");

    private String text;

    Blah(String text) {
        this.text = text;
    }

    public String getText() {
        return this.text;
    }

    public static Blah fromString(String text) {
        for (Blah b : Blah.values()) {
            if (b.text.equalsIgnoreCase(text)) {
                return b;
            }
        }
        return null;
    }
}
824
ответ дан 22 November 2019 в 20:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: