web-dev-qa-db-fra.com

Convertir une chaîne en valeur Enum équivalente

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

Je peux bien sûr faire cela avec un grand if-else _ dé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 ne suis pas trop optimiste que cela soit possible sans ifs ou une déclaration de cas.

86
Ankur

J'espère que vous réalisez que Java.util.Enumeration Est différent des types Java 1.5 Enum .

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

Donc si votre enum est défini comme suit:

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

Vous pourriez faire ceci:

String day = "SUNDAY";

Day dayEnum = Day.valueOf(day);
198
adarshr

En supposant que vous utilisiez Java 5 énumérations (ce qui n’est pas si certain puisque vous mentionnez old Enumeration class)), vous pouvez utiliser la méthode valueOf de Java.lang.Enum sous-classe:

MyEnum e = MyEnum.valueOf("ONE_OF_CONSTANTS");
16
Xion

Utilisez la méthode statique valueOf(String) définie pour chaque enum.

Par exemple, si vous avez enum MyEnum, Vous pouvez dire MyEnum.valueOf("foo")

7
AlexR

J'aurais peut-être trop conçu ma propre solution sans réaliser que 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 IllegalArgumentException contre RuntimeException (ou toute exception que vous souhaitez lancer) qui pourrait potentiellement nettoyer le code.

3
anon58192932