2345 Stimmen

Wie erhält man einen Enum-Wert aus einem String-Wert in Java?

Sagen wir, ich habe eine Aufzählung, die nur aus

public enum Blah {
    A, B, C, D
}

und ich möchte den Enum-Wert einer Zeichenkette finden, zum Beispiel "A" das hieße Blah.A . Wie wäre es möglich, dies zu tun?

Ist die Enum.valueOf() die Methode, die ich brauche? Wenn ja, wie würde ich sie anwenden?

2602voto

Michael Myers Punkte 183216

Ja, Blah.valueOf("A") wird Ihnen Blah.A .

Beachten Sie, dass der Name ein genau übereinstimmen, einschließlich Gehäuse: Blah.valueOf("a") y Blah.valueOf("A ") werfen beide eine IllegalArgumentException .

Die statischen Methoden valueOf() y values() werden zur Kompilierzeit erstellt und erscheinen nicht im Quellcode. Sie erscheinen jedoch im Javadoc; zum Beispiel, Dialog.ModalityType zeigt beide Methoden.

1040voto

JoséMi Punkte 11032

Eine andere Lösung, wenn der Text nicht mit dem Aufzählungswert übereinstimmt:

public enum Blah {
    A("text1"),
    B("text2"),
    C("text3"),
    D("text4");

    private String text;

    Blah(String text) {
        this.text = text;
    }

    public String getText() {
        return this.text;
    }

    public static Blah fromString(String text) {
        for (Blah b : Blah.values()) {
            if (b.text.equalsIgnoreCase(text)) {
                return b;
            }
        }
        return null;
    }
}

162voto

Darrell Teague Punkte 3794

Verwenden Sie das Muster aus Joshua Bloch , Leistungsfähiges Java :

(der Kürze halber vereinfacht)

enum MyEnum {
    ENUM_1("A"),
    ENUM_2("B");

    private String name;

    private static final Map<String,MyEnum> ENUM_MAP;

    MyEnum (String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    // Build an immutable map of String name to enum pairs.
    // Any Map impl can be used.

    static {
        Map<String,MyEnum> map = new ConcurrentHashMap<String, MyEnum>();
        for (MyEnum instance : MyEnum.values()) {
            map.put(instance.getName().toLowerCase(),instance);
        }
        ENUM_MAP = Collections.unmodifiableMap(map);
    }

    public static MyEnum get (String name) {
        return ENUM_MAP.get(name.toLowerCase());
    }
}

Siehe auch:

Oracle Java Beispiel mit Enum und Map of instances

Reihenfolge der Ausführung statischer Blöcke in einem Enum-Typ

Wie kann ich ein Java-Enum anhand seines String-Wertes nachschlagen?

133voto

Geoffrey Zheng Punkte 6444

Hier ist ein nützliches Programm, das ich verwende:

/**
 * A common method for all enums since they can't have another base class
 * @param <T> Enum type
 * @param c enum type. All enums must be all caps.
 * @param string case insensitive
 * @return corresponding enum, or null
 */
public static <T extends Enum<T>> T getEnumFromString(Class<T> c, String string) {
    if( c != null && string != null ) {
        try {
            return Enum.valueOf(c, string.trim().toUpperCase());
        } catch(IllegalArgumentException ex) {
        }
    }
    return null;
}

In meiner Enum-Klasse habe ich dann normalerweise dies, um etwas Tipparbeit zu sparen:

public static MyEnum fromString(String name) {
    return getEnumFromString(MyEnum.class, name);
}

Wenn Ihre Enums nicht in Großbuchstaben geschrieben sind, ändern Sie einfach die Enum.valueOf Linie.

Schade, dass ich nicht die T.class para Enum.valueOf como T gelöscht wird.

81voto

João Portela Punkte 5940

Sie sollten auch mit Ihrem Fall vorsichtig sein. Ich erkläre es Ihnen: Wenn Sie Blah.valueOf("A") funktioniert, aber Blah.valueOf("a") wird nicht funktionieren. Dann wieder Blah.valueOf("a".toUpperCase(Locale.ENGLISH)) funktionieren würde.

Unter Android sollten Sie Locale.US als sulai weist darauf hin .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X