Преобразование String в эквивалентное значение Enum

100

Могу ли я преобразовать a Stringв эквивалентное значение в Enumeration, используя Java.

Я, конечно, могу сделать это с большим if-elseзаявлением, но по возможности я бы хотел этого избежать.

Учитывая эту документацию:

http://download.oracle.com/javase/1.4.2/docs/api/java/util/Enumeration.html

Я не очень надеюсь, что это возможно без ifs или case.

Анкур
источник

Ответы:

221

Надеюсь, вы понимаете, java.util.Enumerationэто отличается от типов Enum Java 1.5 .

Вы можете просто использовать YourEnum.valueOf("String")для получения эквивалентного типа перечисления.

Таким образом, если ваше перечисление определено так:

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY
}

Вы могли сделать это:

String day = "SUNDAY";

Day dayEnum = Day.valueOf(day);
Адаршр
источник
да, спасибо, только что видел это download.oracle.com/javase/1,5.0/docs/api/java/lang/Enum.html
Ankur
18

Предполагая, что вы используете перечисления Java 5 (что не так очевидно, поскольку вы упоминаете старый Enumerationкласс), вы можете использовать valueOfметод java.lang.Enumподкласса:

MyEnum e = MyEnum.valueOf("ONE_OF_CONSTANTS");
Xion
источник
8

Используйте статический метод, valueOf(String)определенный для каждого enum.

Например, если у вас есть, enum MyEnumвы можете сказатьMyEnum.valueOf("foo")

AlexR
источник
4

Я мог перестроить свое собственное решение, не осознавая, что оно Type.valueOf("enum string")действительно существует.

Я предполагаю, что это дает более детальный контроль, но я не уверен, что это действительно необходимо.

public enum Type {
    DEBIT,
    CREDIT;

    public static Map<String, Type> typeMapping = Maps.newHashMap();
    static {
        typeMapping.put(DEBIT.name(), DEBIT);
        typeMapping.put(CREDIT.name(), CREDIT);
    }

    public static Type getType(String typeName) {
        if (typeMapping.get(typeName) == null) {
            throw new RuntimeException(String.format("There is no Type mapping with name (%s)"));
        }
        return typeMapping.get(typeName);
    }
}

Я думаю , вы обмен IllegalArgumentExceptionна RuntimeException(или что - то исключение вы хотите бросить) , которые потенциально могли бы чистый код вверх.

анон58192932
источник