Преобразование 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");

8

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

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


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(или что - то исключение вы хотите бросить) , которые потенциально могли бы чистый код вверх.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.