503 Stimmen

Verwendung von Enum-Werten als String-Literale

Wie lassen sich die in einer Enum gespeicherten Werte am besten als String-Literale verwenden? Zum Beispiel:

public enum Modes {
    some-really-long-string,
    mode1,
    mode2,
    mode3
}

Später könnte ich dann Mode.mode1 um seine String-Repräsentation als mode1 . Ohne ständig anrufen zu müssen Mode.mode1.toString() .

31voto

vamsi Punkte 371
public enum Modes {
  MODE1("Mode1"),
  MODE2("Mode2"),
  MODE3("Mode3");

 private String value;
 public String getValue() {
    return value;
   }
 private Modes(String value) {
  this.value = value;
 } 
}

können Sie einen Aufruf wie unten machen, wo immer Sie den Wert als String aus dem Enum erhalten möchten.

Modes.MODE1.getvalue();

Dies ergibt "Mode1" als String.

9voto

Ethan Punkte 1567

Für meine Enums mag ich nicht wirklich daran denken, dass ihnen jeweils 1 String zugewiesen wird. So implementiere ich eine toString()-Methode für Enums.

enum Animal
{
    DOG, CAT, BIRD;
    public String toString(){
        switch (this) {
            case DOG: return "Dog";
            case CAT: return "Cat";
            case BIRD: return "Bird";
        }
        return null;
    }
}

1 Stimmen

Das Auslösen einer Laufzeitausnahme wäre besser, anstatt null zurückzugeben, da es unerreichbarer Code sein sollte?

1 Stimmen

Les return ist überflüssig, da das Einschalten von enums mit allen enums beendet wird.

8voto

Jake Roussel Punkte 621

Soweit ich weiß, ist die einzige Möglichkeit, den Namen zu erhalten, die

Mode.mode1.name();

Wenn Sie es aber wirklich brauchen, können Sie das tun:

public enum Modes {
    mode1 ("Mode1"),
    mode2 ("Mode2"),
    mode3 ("Mode3");

    private String name;       

    private Modes(String s) {
        name = s;
    }
}

1 Stimmen

Aber in diesem Fall, Mode.mode1 ist noch nicht vom Typ String .

0 Stimmen

Ach ja. Sie bräuchten eine getName()-Methode, die irgendwie den Zweck verfehlt, also nein, Sie können dies nicht tun.

0 Stimmen

"name" ist ein falscher Feldname, es ist ein Standardfeld einer Aufzählung.

7voto

Peter Lawrey Punkte 511323

Sie können verwenden Mode.mode1.name() Dies ist jedoch häufig nicht erforderlich.

Mode mode =
System.out.println("The mode is "+mode);

7 Stimmen

Es ist erwähnenswert, dass der Operator + die Funktion toString() für die Aufzählung aufruft und nicht name(). Und toString() kann überschrieben werden, um etwas anderes als den Namen zurückzugeben (auch wenn dies nicht erwünscht ist)

1 Stimmen

Beide name() et toString() überschrieben werden kann, aber das wird hoffentlich beim Lesen des Codes für die enum wenn dies der Fall ist.

9 Stimmen

Nein. name() ist endgültig und gibt immer den Namen der Aufzählung zurück, wie er in der Aufzählungsdeklaration angegeben ist.

6voto

Meine Lösung für Ihr Problem!

import java.util.HashMap;
import java.util.Map;

public enum MapEnumSample {
    Mustang("One of the fastest cars in the world!"), 
    Mercedes("One of the most beautiful cars in the world!"), 
    Ferrari("Ferrari or Mercedes, which one is the best?");

    private final String description;
    private static Map<String, String> enumMap;

    private MapEnumSample(String description) {
        this.description = description;
    }

    public String getEnumValue() {
        return description;
    }

    public static String getEnumKey(String name) {
        if (enumMap == null) {
            initializeMap();
        }
        return enumMap.get(name);
    }

    private static Map<String, String> initializeMap() {
        enumMap = new HashMap<String, String>();
        for (MapEnumSample access : MapEnumSample.values()) {
            enumMap.put(access.getEnumValue(), access.toString());
        }
        return enumMap;
    }

    public static void main(String[] args) {

        // getting value from Description
        System.out.println(MapEnumSample.getEnumKey("One of the fastest cars in the world!"));

        // getting value from Constant
        System.out.println(MapEnumSample.Mustang.getEnumValue());

        System.out.println(MapEnumSample.getEnumKey("One of the most beautiful cars in the world!"));
        System.out.println(MapEnumSample.Mercedes.getEnumValue());

        // doesnt exist in Enum
        System.out.println("Mustang or Mercedes, which one is the best?");
        System.out.println(MapEnumSample.getEnumKey("Mustang or Mercedes, which one is the best?") == null ? "I don't know!" : "I believe that "
                + MapEnumSample.getEnumKey("Ferrari or Mustang, which one is the best?") + " is the best!.");

        // exists in Enum
        System.out.println("Ferrari or Mercedes, wich one is the best?");
        System.out.println(MapEnumSample.getEnumKey("Ferrari or Mercedes, which one is the best?") == null ? "I don't know!" : "I believe that "
                + MapEnumSample.getEnumKey("Ferrari or Mercedes, which one is the best?") + " is the best!");

    }
}

0 Stimmen

Es sieht so aus, als ob das Problem des Auftraggebers schon vor 4 Jahren gelöst wurde, aber willkommen bei StackOverflow :)

1 Stimmen

Danke, nur um jemandem wie mir zu helfen, der nach objektiveren Antworten auf alte Probleme sucht :)

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