Converter String em valor Enum equivalente

99

É possível para mim converter a Stringem um valor equivalente em um Enumeration, usando Java.

Claro que posso fazer isso com uma if-elseinstrução grande , mas gostaria de evitar isso, se possível.

Dada esta documentação:

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

Não tenho muita esperança de que isso seja possível sem ifs ou uma declaração de caso.

Ankur
fonte

Respostas:

220

Espero que você perceba, java.util.Enumerationé diferente dos tipos de Enum do Java 1.5 .

Você pode simplesmente usar YourEnum.valueOf("String")para obter o tipo de enum equivalente.

Assim, se seu enum for definido como:

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

Você poderia fazer isso:

String day = "SUNDAY";

Day dayEnum = Day.valueOf(day);
Adarshr
fonte
sim, obrigado, acabei de ver este download.oracle.com/javase/1,5.0/docs/api/java/lang/Enum.html
Ankur
18

Supondo que você use enums Java 5 (o que não é tão certo, já que você mencionou a Enumerationclasse antiga ), você pode usar o valueOfmétodo da java.lang.Enumsubclasse:

MyEnum e = MyEnum.valueOf("ONE_OF_CONSTANTS");
Xion
fonte
8

Use o método estático valueOf(String)definido para cada um enum.

Por exemplo, se você tem, enum MyEnumpode dizerMyEnum.valueOf("foo")

AlexR
fonte
4

Eu posso ter super-projetado minha própria solução sem perceber que ela Type.valueOf("enum string")realmente existia.

Acho que dá um controle mais granular, mas não tenho certeza se é realmente necessário.

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

Eu acho que você está trocando IllegalArgumentExceptionpor RuntimeException(ou qualquer exceção que você deseja lançar) que poderia potencialmente limpar o código.

anon58192932
fonte