Konwertuj String na równoważną wartość Enum

100

Czy mogę przekonwertować a Stringna równoważną wartość w pliku Enumeration, używając języka Java.

Oczywiście mogę to zrobić za pomocą dużego if-elseoświadczenia, ale chciałbym tego uniknąć, jeśli to możliwe.

Biorąc pod uwagę tę dokumentację:

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

Nie mam nadziei, że jest to możliwe bez „ifs” lub oświadczenia.

Ankur
źródło

Odpowiedzi:

221

Mam nadzieję, że zdajesz sobie sprawę, java.util.Enumerationróżni się od typów Enum Java 1.5 .

Możesz po prostu użyć, YourEnum.valueOf("String")aby uzyskać równoważny typ wyliczenia.

Tak więc, jeśli twoje wyliczenie jest zdefiniowane jako tak:

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

Możesz to zrobić:

String day = "SUNDAY";

Day dayEnum = Day.valueOf(day);
adarshr
źródło
tak, dzięki właśnie zobaczyłem ten plik do pobrania.oracle.com/javase/1,5.0/docs/api/java/lang/Enum.html
Ankur
18

Zakładając, że używasz wyliczeń Java 5 (co nie jest takie pewne, ponieważ wspomniałeś o starej Enumerationklasie), możesz użyć valueOfmetody java.lang.Enumpodklasy:

MyEnum e = MyEnum.valueOf("ONE_OF_CONSTANTS");
Xion
źródło
8

Użyj metody statycznej valueOf(String)zdefiniowanej dla każdego enum.

Na przykład, jeśli masz enum MyEnum, możesz powiedziećMyEnum.valueOf("foo")

AlexR
źródło
4

Mogłem przeprojektować własne rozwiązanie, nie zdając sobie sprawy, że Type.valueOf("enum string")faktycznie istniało.

Myślę, że daje to bardziej szczegółową kontrolę, ale nie jestem pewien, czy jest to naprawdę konieczne.

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);
    }
}

Myślę, że wymieniasz się IllegalArgumentExceptionna RuntimeException(lub jakikolwiek wyjątek, który chcesz rzucić), który może potencjalnie oczyścić kod.

anon58192932
źródło