Abrufen des String-Werts von enum in Java

75

Ich habe eine Aufzählung wie diese definiert und möchte die Zeichenfolgen für die einzelnen Status erhalten können. Wie soll ich eine solche Methode schreiben?

Ich kann die int-Werte der Status abrufen, möchte aber die Option, die Zeichenfolgenwerte auch von den Ints abzurufen.

public enum Status {
    PAUSE(0),
    START(1),
    STOP(2);

    private final int value;

    private Status(int value) {
        this.value = value
    }

    public int getValue() {
        return value;
    }
}
Mozbi
quelle
7
Status s = Status.PAUSE; System.out.println (s.name ());
Nikola Yovchev
Diese Antwort wird Ihnen helfen, stackoverflow.com/questions/17606866/…
Prasad Kharkar
2
Anstatt 0,1,2 zu definieren, können SieStatus.ordinal();
Arnaud Denoyelle
2
@ArnaudDenoyelle: Sie sollten die Verwendung von ordinal () vermeiden, siehe Joshua Bloch "Effective Java"
GarfieldKlon
1
@ GarfieldKlon Ich stimme zu. Ich rate nicht (und werde es auch nie), sich darauf zu verlassen, ordinal()da das Hinzufügen eines Wertes in der Aufzählung die Ordnungszahl jeder Aufzählung verschiebt. Ich wollte darauf hinweisen, dass das OP das ordinal()Verhalten des OP duplizierte .
Arnaud Denoyelle

Antworten:

111

Wenn statuses vom Typ Statusenum ist status.name(), erhalten Sie den definierten Namen.

hart
quelle
3
@JoeMaher toString()scheint der bevorzugte Weg gemäß der offiziellen Dokumentation zu sein: "Die meisten Programmierer sollten die toString () -Methode gegenüber dieser bevorzugen, da die toString-Methode möglicherweise einen benutzerfreundlicheren Namen zurückgibt." ( docs.oracle.com/javase/6/docs/api/java/lang/Enum.html#name () )
Carsten
7
@Carsten status.name()ist geeignet, wenn Sie es im Code verwenden möchten (aus Gründen der Genauigkeit und Konsistenz), und status.toString()geeignet, wenn Sie es dem Benutzer anzeigen möchten (aus Gründen der Lesbarkeit).
Intcreator
50

Sie können folgende values()Methode verwenden:

Zum Beispiel Status.values()[0]wird PAUSE in Ihrem Fall zurückgegeben, wenn Sie es drucken, toString()wird aufgerufen und "PAUSE" wird gedruckt.

Juvanis
quelle
Richtig, nur hinzuzufügen Status.values()[0]wäre vom Typ Statusnicht String.
hart
12

Verwenden Sie den Standardmethodennamen () als Balg

public enum Category {
        ONE("one"),
        TWO ("two"),
        THREE("three");

        private final String name;

        Category(String s) {
            name = s;
        }

    }

public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println(Category.ONE.name());
    }
}
Biswajit Karmakar
quelle
1
Warum nicht toString überschreiben, um den Namen zurückzugeben?
Mohammed Housseyn Taleb
4
Gibt was zurück? EIN oder eins, es gibt einen Unterschied (den Namen der Aufzählung oder seinen Wert)
Merkur
9

Sie können diese Methode zu Ihrer Statusliste hinzufügen:

 public static String getStringValueFromInt(int i) {
     for (Status status : Status.values()) {
         if (status.getValue() == i) {
             return status.toString();
         }
     }
     // throw an IllegalArgumentException or return null
     throw new IllegalArgumentException("the given number doesn't match any Status.");
 }

public static void main(String[] args) {
    System.out.println(Status.getStringValueFromInt(1)); // OUTPUT: START
}
M. Abbas
quelle
0

Ich glaube, enum hat einen .name () in seiner API, der wie in diesem Beispiel ziemlich einfach zu verwenden ist:

private int security;
public String security(){ return Security.values()[security].name(); }
public void setSecurity(int security){ this.security = security; }

    private enum Security {
            low,
            high
    }

Damit können Sie einfach anrufen

yourObject.security() 

In diesem Beispiel wird high / low als String zurückgegeben

Joao Cesar Stange
quelle