Вопрос-ответ

How to get an enum value from a string value in Java

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

Допустим, у меня есть перечисление, которое просто

public enum Blah {
A, B, C, D
}

и я хотел бы найти перечисляемое значение строки, например, "A" которое было бы Blah.A. Как это можно было бы сделать?

Это Enum.valueOf() тот метод, который мне нужен? Если да, то как я могу это использовать?

Переведено автоматически
Ответ 1

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

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

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

Ответ 2

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

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;
}
}
Ответ 3

Используйте шаблон от Джошуа Блоха, Эффективная Java:

(simplified for brevity)

enum MyEnum {
ENUM_1("A"),
ENUM_2("B");

private String name;

private static final Map<String,MyEnum> ENUM_MAP;

MyEnum (String name) {
this.name = name;
}

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

// Build an immutable map of String name to enum pairs.
// Any Map impl can be used.

static {
Map<String,MyEnum> map = new ConcurrentHashMap<String, MyEnum>();
for (MyEnum instance : MyEnum.values()) {
map.put(instance.getName().toLowerCase(),instance);
}
ENUM_MAP = Collections.unmodifiableMap(map);
}

public static MyEnum get (String name) {
return ENUM_MAP.get(name.toLowerCase());
}
}

Also see:

Oracle Java Example using Enum and Map of instances

Execution order of of static blocks in an Enum type

How can I lookup a Java enum from its String value

Ответ 4

Here's a nifty utility I use:

/**
* 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;
}

Then in my enum class I usually have this to save some typing:

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

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

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

java enums