Преобразовать строку в эквивалентное значение Enum - PullRequest
85 голосов
/ 14 августа 2011

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

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

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

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

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

Ответы [ 4 ]

193 голосов
/ 14 августа 2011

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

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

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

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

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

String day = "SUNDAY";

Day dayEnum = Day.valueOf(day);
16 голосов
/ 14 августа 2011

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

MyEnum e = MyEnum.valueOf("ONE_OF_CONSTANTS");
7 голосов
/ 14 августа 2011

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

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

3 голосов
/ 15 июня 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...