Was ist der einfachste und / oder kürzeste Weg, um die Namen von Enum-Elementen als Array von String
s zu erhalten?
Damit meine ich, dass ich zum Beispiel die folgende Aufzählung hätte:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
public static String[] names() {
// ...
}
}
Die names()
Methode würde das Array zurückgeben { "NEW", "RUNNABLE", "BLOCKED", "WAITING", "TIMED_WAITING", "TERMINATED" }
.
Antworten:
Hier ist ein Einzeiler für jede
enum
Klasse:Pre Java 8 ist immer noch ein Einzeiler, wenn auch weniger elegant:
Das würdest du so nennen:
Wenn Sie nur etwas Einfaches für eine fest codierte Enum-Klasse möchten:
quelle
e.getEnumConstants()
Sie verwenden könnenYourEnumName.values()
YourEnumName.values()
ruft eine statische Methode für die Klasse auf, die für keine Aufzählung wiederverwendet werden kann . Verwenden vongetEnumConstants()
Werken für jede Enum-Klasse. Die Idee mit dieser Methode ist, eine Dienstprogrammmethode neu zu erstellen, die Sie wie die letzte Zeile der Antwort aufrufen können.Class<? extends Enum<?>> e
?Erstellen Sie ein
String[]
Array für die Namen und rufen Sie die statischevalues()
Methode auf, die alle Aufzählungswerte zurückgibt. Durchlaufen Sie dann die Werte und füllen Sie das Namensarray.quelle
values()
13 Mal aufrufen und jedes Mal ein neues Array generieren, anstatt das Array in einer lokalen Variablen zwischenzuspeichern? Warum sollten Sie toString () verwenden, das überschreibbar ist, anstattname()
?name()
bis jetzt eine Methode gab. wie dumm von mir: P danke, dass du mich informiert hast :)Hier ist eine elegante Lösung mit Apache Commons Lang 3 :
Obwohl eine Liste zurückgegeben wird, können Sie die Liste problemlos mit konvertieren
list.toArray()
quelle
EnumUtils.getEnumList(enumClass)
Gibt die Enum-Werte zurück, nicht die Strings. Sie könnten verwendenEnumUtils.getEnumMap(enumClass).keySet()
, aber die Reihenfolge könnte anders sein.Wenn Sie Java 8 verwenden können, funktioniert dies gut (Alternative zu Yuras Vorschlag, effizienter):
quelle
Mit Java 8:
quelle
Ich würde es so schreiben
quelle
So etwas würde reichen:
Die Dokumentation empfiehlt die Verwendung
toString()
stattname()
in den meisten Fällen , aber Sie haben für den Namen hier ausdrücklich gefragt.quelle
values()
es zweimal aufgerufen, wenn es nur einmal aufgerufen werden muss.values()
ist eine Methode vom Compiler generiert, also denke ich, dass sie ziemlich optimiert ist. Schließlich erinnere ich mich, dass ich irgendwo gelesen habe, dass for-each-Schleifen effizienter als Standard sind, inkrementell für Schleifen, aber andererseits - es spielt einfach keine Rolle .for (int i = 0; i < a.length; i++) /* do stuff */;
In diesem Fall foreach-Schleifen sind in der Tat effizienter. Eine schnelle SO-Suche zu diesem Thema gibt uns FolgendesAndere Möglichkeiten:
Erster
Andere Weise
quelle
toString()
funktioniert, im allgemeinen Fall jedoch nicht, datoString()
überschrieben werden kann. Verwenden Sie,.name()
um zuverlässig die Instanz zu erhalten Namen als String.Meine Lösung mit Manipulation von Strings (nicht die schnellste, aber kompakte):
quelle
Ich würde es so machen (aber ich würde wahrscheinlich Namen zu einer nicht veränderbaren Menge anstelle eines Arrays machen):
quelle
names()
Methode nur sparsam aufgerufen wird, halte ich es für in Ordnung, ein Array vor Ort zu generieren.Ich habe das gleiche Bedürfnis und verwende eine generische Methode (innerhalb einer ArrayUtils-Klasse):
Und definieren Sie einfach eine STATIK in der Aufzählung ...
Java-Enums vermissen wirklich eine names () - und get (index) -Methode, sie sind wirklich hilfreich.
quelle
der gewöhnliche Weg (Wortspiel beabsichtigt):
quelle
Ich habe ein bisschen an der Lösung von @ Bohemian getestet. Die Leistung ist besser, wenn stattdessen eine naive Schleife verwendet wird.
quelle
org.apache.commons.lang3.EnumUtils.getEnumMap (State.class) .keySet ()
quelle
EnumUtils
?Wenn Sie das kürzeste wollen, können Sie es versuchen
quelle
vales()
einmal aufgerufen wird)Nur ein Gedanke: Vielleicht müssen Sie keine Methode erstellen, um die Werte der Aufzählung als Array von Zeichenfolgen zurückzugeben.
Warum brauchen Sie eine Reihe von Zeichenfolgen? Möglicherweise müssen Sie die Werte nur konvertieren, wenn Sie sie verwenden, wenn Sie dies jemals tun müssen.
Beispiele:
quelle
Eine andere Möglichkeit, dies in Java 7 oder früher zu tun, wäre die Verwendung von Guava:
quelle
Versuche dies:
quelle
Sie können Enum-Werte in die Liste der Zeichenfolgen einfügen und in ein Array konvertieren:
quelle
Der einfachste Weg:
Wobei Kategorie
Enum
Name istquelle