Convertir la chaîne en valeur Enum équivalente

99

Est-il possible pour moi de convertir a Stringen une valeur équivalente dans un Enumeration, en utilisant Java.

Je peux bien sûr le faire avec une grande if-elsedéclaration, mais je voudrais éviter cela si possible.

Compte tenu de cette documentation:

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

Je n'ai pas trop bon espoir que cela soit possible sans si ni déclaration de cas.

Ankur
la source

Réponses:

220

J'espère que vous vous rendez compte, java.util.Enumerationest différent des types Java 1.5 Enum .

Vous pouvez simplement utiliser YourEnum.valueOf("String") pour obtenir le type enum équivalent.

Ainsi, si votre énumération est définie comme suit:

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

Vous pouvez faire ceci:

String day = "SUNDAY";

Day dayEnum = Day.valueOf(day);
Adarshr
la source
18

En supposant que vous utilisez des énumérations Java 5 (ce qui n'est pas si sûr puisque vous mentionnez une ancienne Enumerationclasse), vous pouvez utiliser la valueOfméthode de la java.lang.Enumsous-classe:

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

Utiliser la méthode statique valueOf(String)définie pour chaqueenum .

Par exemple, si vous avez, enum MyEnumvous pouvez direMyEnum.valueOf("foo")

AlexR
la source
4

J'aurais peut-être sur-conçu ma propre solution sans me rendre compte qu'elle Type.valueOf("enum string")existait réellement.

Je suppose que cela donne un contrôle plus granulaire, mais je ne suis pas sûr que ce soit vraiment nécessaire.

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

Je suppose que vous échangez IllegalArgumentExceptionpour RuntimeException(ou toute exception que vous souhaitez lancer) qui pourrait potentiellement nettoyer le code.

anon58192932
la source