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

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.


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.


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

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
}

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.