Перетворити рядок на еквівалентне значення Enum


99

Чи можливо мені перетворити a Stringна еквівалентне значення в Enumeration, використовуючи Java.

Звичайно, я можу зробити це за допомогою великої if-elseзаяви, але я хотів би цього уникнути, якщо це можливо.

Враховуючи цю документацію:

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

Я не надто сподіваюся, що це можливо без ifs або заяви про справу.

Відповіді:


220

Сподіваюся, ви розумієте, що 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);

так, дякую, щойно побачили це завантаження.
oracle.com/javase/1,5.0/docs/api/java/lang/Enum.html

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.