So erhalten Sie einen Aufzählungswert aus einem Zeichenfolgenwert in Java

Lesezeit: 5 Minuten

So erhalten Sie einen Aufzahlungswert aus einem Zeichenfolgenwert in Java
Maleachi

Angenommen, ich habe eine Aufzählung, die gerade ist

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

und ich möchte zum Beispiel den Enum-Wert einer Zeichenfolge finden "A" welches sein würde Blah.A. Wie wäre das möglich?

Ist der Enum.valueOf() die Methode, die ich brauche? Wenn ja, wie würde ich das verwenden?

1646642830 174 So erhalten Sie einen Aufzahlungswert aus einem Zeichenfolgenwert in Java
JoséMi

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

  • throw new IllegalArgumentException("No constant with text " + text + " found") wäre besser als return null.

    – Whiskysierra

    31. Juli 2010 um 10:28 Uhr

  • @Sangdol Normalerweise ist es eine gute Sache zu überprüfen, was SUN – oops – Oracle in der gleichen Situation tut. Und wie Aufzählung.valueOf() zeigt es IST bewährte Methode, um in diesem Fall eine Ausnahme auszulösen. Weil es ist eine Ausnahmesituation. „Leistungsoptimierung“ ist eine schlechte Ausrede, um unlesbaren Code zu schreiben 😉

    – raudi

    2. Februar 2012 um 7:43 Uhr


  • Dies ist in Java 8 noch einfacher, da Sie Folgendes tun können:Stream.of(MyEnum.values()).collect(toMap(Enum::name, identity())) Ich empfehle auch, toString() (über den Konstruktor übergeben) zu überschreiben und diesen anstelle von name zu verwenden, insbesondere wenn die Enum mit serialisierbaren Daten verknüpft ist, da Sie so die Schreibweise steuern können, ohne Sonar einen Fit zu geben.

    – Novaterata

    27. April 2017 um 17:01 Uhr


  • Die statische Initialisierung ist inhärent synchronisiertalso gibt es absolut keinen Grund zu verwenden ConcurrentHashMap Hier, wo die Karte nach der Initialisierung nie geändert wird. Deshalb verwendet zB auch das Beispiel im JLS selbst einen regular HashMap.

    – Radiodef

    5. August 2018 um 17:24 Uhr


So erhalten Sie einen Aufzahlungswert aus einem Zeichenfolgenwert in Java
Geoffrey Zheng

Hier ist ein raffiniertes Dienstprogramm, 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;
}

Dann habe ich in meiner Enum-Klasse normalerweise Folgendes, um etwas Tipparbeit zu sparen:

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

Wenn Ihre Aufzählungen nicht alle Großbuchstaben sind, ändern Sie einfach die Enum.valueOf Linie.

Es ist schade, dass ich es nicht verwenden kann T.class zum Enum.valueOf als T wird gelöscht.

  • Dieser leere Fangblock macht mich wirklich verrückt, sorry.

    – Whiskysierra

    31. Juli 2010 um 10:14 Uhr

  • @LazloBonin: Ausnahmen gelten für außergewöhnliche Bedingungen, nicht für den Kontrollfluss. Holen Sie sich eine Kopie von Effektives Java.

    – Martin Schröder

    15. November 2011 um 17:09 Uhr

  • Entsetzlich! Immer, immer Fangen Sie Ausnahmen ab, wo Sie sie behandeln können. Das obige Beispiel ist ein perfektes Beispiel wie man es NICHT macht. Warum? Es gibt also NULL zurück, und der Aufrufer muss dann gegen NULL prüfen oder ein NPE werfen. Wenn der Caller weiß, wie er mit der Situation umgeht, dann kann ein if vs. try-catch etwas eleganter aussehen, ABER wenn er nicht damit umgehen kann, muss er wieder null übergeben und der Aufrufer des Aufrufers aufs Neue muss gegen NULL prüfen usw. usw.

    – raudi

    2. Februar 2012 um 7:52 Uhr

  • @whiskeysierra Ich verstehe, dass eine Leidenschaft für Java oder Softwareentwicklung eine Sache ist, aber man muss sich entspannen, Mann. Kein Vorteil, wenn man so ausflippt / extra ist.

    – Aakash Verma

    21. September 2021 um 13:42 Uhr


1646642831 450 So erhalten Sie einen Aufzahlungswert aus einem Zeichenfolgenwert in Java
Peter Mortensen

Sie sollten auch mit Ihrem Fall vorsichtig sein. Lassen Sie mich erklären: tun Blah.valueOf("A") funktioniert, aber Blah.valueOf("a") wird nicht funktionieren. Dann wieder Blah.valueOf("a".toUpperCase(Locale.ENGLISH)) würde funktionieren.

Auf Android sollten Sie verwenden Locale.USwie Sulai betont.

  • Dieser leere Fangblock macht mich wirklich verrückt, sorry.

    – Whiskysierra

    31. Juli 2010 um 10:14 Uhr

  • @LazloBonin: Ausnahmen gelten für außergewöhnliche Bedingungen, nicht für den Kontrollfluss. Holen Sie sich eine Kopie von Effektives Java.

    – Martin Schröder

    15. November 2011 um 17:09 Uhr

  • Entsetzlich! Immer, immer Fangen Sie Ausnahmen ab, wo Sie sie behandeln können. Das obige Beispiel ist ein perfektes Beispiel wie man es NICHT macht. Warum? Es gibt also NULL zurück, und der Aufrufer muss dann gegen NULL prüfen oder ein NPE werfen. Wenn der Caller weiß, wie er mit der Situation umgeht, dann kann ein if vs. try-catch etwas eleganter aussehen, ABER wenn er nicht damit umgehen kann, muss er wieder null übergeben und der Aufrufer des Aufrufers aufs Neue muss gegen NULL prüfen usw. usw.

    – raudi

    2. Februar 2012 um 7:52 Uhr

  • @whiskeysierra Ich verstehe, dass eine Leidenschaft für Java oder Softwareentwicklung eine Sache ist, aber man muss sich entspannen, Mann. Kein Vorteil, wenn man so ausflippt / extra ist.

    – Aakash Verma

    21. September 2021 um 13:42 Uhr


Verwenden Sie in Java 8 oder höher Ströme:

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 Optional<Blah> fromText(String text) {
        return Arrays.stream(values())
          .filter(bl -> bl.text.equalsIgnoreCase(text))
          .findFirst();
    }
}

  • Java 8 hat einige gute Dinge getan und obwohl ich Streams mag (meistens wegen Parallelität) … ist dies eigentlich KEIN Grund, sie zu verwenden. Es kauft dem OP nichts und schneidet schlechter ab … ersetzt einfach eine for / next-Schleife durch alle Elemente durch eine Stream-Version derselben (und nicht einmal parallel). Für ein paar Einträge …. wen interessiert es, aber um klar zu sein, dies ist kein Beispiel “es ist viel besser wegen Java 8”. Es ist nur eine “andere” Implementierung im fließenden Stil von Grün vs. Blau, die eine optionale vs. null zurückgibt (und der fließende Stil erfordert eine Nicht-Null-Rückgabe für alle verbundenen Methoden).

    – Darrell Teague

    9. September 2021 um 22:48 Uhr

964510cookie-checkSo erhalten Sie einen Aufzählungswert aus einem Zeichenfolgenwert in Java

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy