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?

17voto

Murtaza Kanchwala Punkte 2366

Möglicherweise müssen Sie dies tun:

public enum ObjectType {
    PERSON("Person");

    public String parameterName;

    ObjectType(String parameterName) {
        this.parameterName = parameterName;
    }

    public String getParameterName() {
        return this.parameterName;
    }

    // From the String method, it will return you the Enum for the provided input string
    public static ObjectType fromString(String parameterName) {
        if (parameterName != null) {
            for (ObjectType objType : ObjectType.values()) {
                if (parameterName.equalsIgnoreCase(objType.parameterName)) {
                    return objType;
                }
            }
        }
        return null;
    }
}

Eine weitere Ergänzung

   public static String fromEnumName(String parameterName) {
        if (parameterName != null) {
            for (DQJ objType : DQJ.values()) {
                if (parameterName.equalsIgnoreCase(objType.name())) {
                    return objType.parameterName;
                }
            }
        }
        return null;
    }

Dies gibt Ihnen den Wert durch einen stringifizierten Enum-Namen zurück. Wenn Sie z. B. "PERSON" in fromEnumName angeben, wird der Wert von Enum, d. h. "Person", zurückgegeben.

15voto

Vikram Punkte 187

Eine andere Möglichkeit, dies zu tun, ist die Verwendung der impliziten statischen Methode name() von Enum. Name gibt die genaue Zeichenkette zurück, die zur Erstellung der Aufzählung verwendet wurde und die zur Überprüfung mit der angegebenen Zeichenkette verwendet werden kann:

public enum Blah {

    A, B, C, D;

    public static Blah getEnum(String s){
        if(A.name().equals(s)){
            return A;
        }else if(B.name().equals(s)){
            return B;
        }else if(C.name().equals(s)){
            return C;
        }else if (D.name().equals(s)){
            return D;
        }
        throw new IllegalArgumentException("No Enum specified for this string");
    }
}

Prüfung:

System.out.println(Blah.getEnum("B").name());

// It will print B  B

Inspiration: 10 Beispiele für Enum in Java

14voto

Novaterata Punkte 3900

In Java 8 ist das statische Map-Muster sogar noch einfacher und ist meine bevorzugte Methode. Wenn Sie die Enum mit Jackson verwenden wollen, können Sie toString überschreiben und das anstelle von name verwenden, dann mit @JsonValue

public enum MyEnum {
    BAR,
    BAZ;
    private static final Map<String, MyEnum> MAP = Stream.of(MyEnum.values()).collect(Collectors.toMap(Enum::name, Function.identity()));
    public static MyEnum fromName(String name){
        return MAP.get(name);
    }
}

public enum MyEnumForJson {
    BAR("bar"),
    BAZ("baz");
    private static final Map<String, MyEnumForJson> MAP = Stream.of(MyEnumForJson.values()).collect(Collectors.toMap(Object::toString, Function.identity()));
    private final String value;

    MyEnumForJson(String value) {
        this.value = value;
    }

    @JsonValue
    @Override
    public String toString() {
        return value;
    }

    public static MyEnumForJson fromValue(String value){
        return MAP.get(value);
    }
}

12voto

javabrew Punkte 196

Hier ist eine Lösung mit Guave Bibliotheken. Die Methode getPlanet() unterscheidet nicht zwischen Groß- und Kleinschreibung, so dass getPlanet ("MerCUrY") Planet.MERCURY zurückgibt.

package com.universe.solarsystem.planets;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Enums;
import com.google.common.base.Optional;

//Pluto and Eris are dwarf planets, who cares!
public enum Planet {
   MERCURY,
   VENUS,
   EARTH,
   MARS,
   JUPITER,
   SATURN,
   URANUS,
   NEPTUNE;

   public static Planet getPlanet(String name) {
      String val = StringUtils.trimToEmpty(name).toUpperCase();
      Optional <Planet> possible = Enums.getIfPresent(Planet.class, val);
      if (!possible.isPresent()) {
         throw new IllegalArgumentException(val + "? There is no such planet!");
      }
      return possible.get();
   }
}

11voto

Ebraheem Alrabeea Punkte 1795

Enum ist sehr nützlich. Ich habe verwendet Enum viel, um eine Beschreibung für einige Felder in verschiedenen Sprachen hinzuzufügen, wie im folgenden Beispiel:

public enum Status {

    ACT(new String[] { "Accepted", "" }),
    REJ(new String[] { "Rejected", "" }),
    PND(new String[] { "Pending", " " }),
    ERR(new String[] { "Error", "" }),
    SNT(new String[] { "Sent", "" });

    private String[] status;

    public String getDescription(String lang) {
        return lang.equals("en") ? status[0] : status[1];
    }

    Status(String[] status) {
        this.status = status;
    }
}

Und dann können Sie die Beschreibung dynamisch auf der Grundlage des Sprachcodes abrufen, der an die getDescription(String lang) Methode, zum Beispiel:

String statusDescription = Status.valueOf("ACT").getDescription("en");

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