Wie man einen enum-Wert einen string-Wert in Java?
Sagen, ich habe eine enum die nur
public enum Blah {
A, B, C, D
}
und ich möchte zu finden, die enum-Wert einen string, zum Beispiel "A"
wäre 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 diese?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja,
Blah.valueOf("A")
geben SieBlah.A
.Beachten Sie, dass der name muss ein genaue übereinstimmen, einschließlich groß:
Blah.valueOf("a")
undBlah.valueOf("A ")
beide werfen einIllegalArgumentException
.Den statischen Methoden
valueOf()
undvalues()
erstellt werden, während der Kompilierung und werden nicht im Quellcode. Sie erscheinen im Javadoc, obwohl, zum Beispiel,- Dialog.ModalityType
zeigt die beiden Methoden.Blah.valueOf("A")
Methode Kleinschreibung und nicht dulden, überflüssige Leerzeichen, so ist die Alternative Lösung vorgeschlagen, die unter dem von @JoséMi.toString()
Wert, Nein, das würde ich nicht sagen.name()
erhalten Sie die aktuellen definierten Namen der enum-Konstanten es sei denn, Sie überschreiben.enum Blah {...}
definition sollte nicht versuchen zu erklären, seine eigenenvalues
nochvaluesOf
. Es ist so, wie Sie schreiben können "AnyTypeName.class" obwohl Sie eigentlich nie erklärt, ein "Klasse" member-variable; der compiler macht alles Nur Arbeit. (Diese Antwort kann nicht mehr nützlich sein, um Sie 3 Monate später, aber nur für den Fall.)Andere Lösung, wenn der text nicht gleich auf die enumeration value:
throw new IllegalArgumentException("No constant with text " + text + " found")
wäre besser alsreturn null
.if(returnval == null)
als die Ausnahme abfangen. Es funktioniert besser, idealistisch zu: macht es mehr Sinn und gibt ein leeres Ergebnis, wenn es nicht mit? oder wirft einen Fehler? Ich denke, es macht mehr Sinn, und gibt ein leeres Ergebnis.Queue
Schnittstelle nicht mitremove
vs.poll
-- zwei Versionen der Methode, gibtnull
auf (einer sehr vorhersehbaren und Häufig) Fehler, und eine, die eine Ausnahme auslöst, dann lass es, wer benutzt es, zu entscheiden, was zu verwenden, basiert auf, was die größeren Anwendung garantiert.if (text == null) return null;
ist besser alsif (text != null) { ....} return null
. Der erste Weg ist einfacher zu verstehen.text.equalsIgnoreCase(b.text)
werfen kann null-Zeiger-Ausnahme aus, wenn null übergeben wirdfromString()
in der Erwägung, dassb.text.equalsIgnoreCase(text)
wird nicht (in Anbetracht der aufgeführten enum-Instanzen).if (text != null) {
..."foo".equals(bar)
stattbar.equals("foo")
text
Feld undgetText()
Methoden ist nicht notwendig, da der code könnte genauso leicht verwendet haben, die automatisch generiertename()
Methode. Es ist auch möglich, schreiben Sie einepublic static <E extends Enum<E>> com.mylibs.Enums.fromString(E enumType, String s)
, die funktionieren würde für beliebiger Enum-Typ.The valueOf() method throws an IllegalArgumentException if the specified name does not match any of the enum constants defined in the class.
Hier ist ein raffiniertes Dienstprogramm, die ich benutze:
Dann in meinem enum-Klasse, die ich in der Regel haben diese, um sich Tipparbeit ersparen:
Wenn Ihr enums sind nicht alle caps, ändern Sie einfach die
Enum.valueOf
Linie.Schade, dass ich nicht verwenden können
T.class
fürEnum.valueOf
alsT
gelöscht.getIfPresent
zurückOptional.absent()
, das ist, was ich würde es vorziehen, zu verwenden; in der Erwägung, dassvalueOfFunction().apply()
zurücknull
.MyEnum.valueOf(name)
?valueOf
String.equalsIgnoreCase
statt diese hardcodedtoUpperCase
?Sollten Sie auch vorsichtig sein, mit Ihrem Fall. Lassen Sie mich erklären: tut
Blah.valueOf("A")
funktioniert, aberBlah.valueOf("a")
wird nicht funktionieren. Dann wiederBlah.valueOf("a".toUpperCase(Locale.ENGLISH))
funktionieren würde.Bearbeiten
Geändert
toUpperCase
zutoUpperCase(Locale.ENGLISH)
basierend auf tc. Kommentar und die java docsedit2
Auf android, die Sie verwenden sollten
Gebietsschema.US
, als sulai Punkte aus.Locale.US
für maschinenlesbare Eingabe/Ausgabe.Verwenden Sie das Muster von Joshua Bloch, Effektive Java -:
(vereinfacht aus Platzgründen)
Siehe auch:
Oracle-Java-Beispiel mit Enum und Anzeigen von Instanzen
Die Reihenfolge der Ausführung von statischen Blöcken in einen Enum-Typ
Wie kann ich nachschlagen einer Java-enum aus seinem String-Wert
Stream.of(MyEnum.values()).collect(toMap(Enum::name, identity()))
ich auch empfehlen überschreiben von toString() (übergeben durch Konstruktor) und verwenden, die anstelle von Namen, vor allem, wenn die Enum im Zusammenhang mit serialisierbare Daten wie diese können Sie Steuern, das Gehäuse ohne Angabe von Sonar passt.unmodifiableMap
sowieso, dann gibt es keinen nutzen zu beginnend mit einemConcurrentHashMap
. Verwenden Sie einfach einHashMap
. (Wenn Sie eine Guave istImmutableMap
dann würde ich empfehlen, dass Sie anstelle!)ConcurrentHashMap
hier, wo die Karte nie geändert werden, werden nach der Initialisierung. Also warum auch z.B. das Beispiel in der JLS selbst verwendet einen regulärenHashMap
.synchronized (map) { ENUM_MAP = Collections.unmodifiableMap(map); }
zu vermeiden indeterministic Verhalten in einem möglichen iterator verwendet wird innerhalb der Methode für die Erstellung der unveränderliche version - als standard, so dass der junior-dev nicht zu denken zu viel über die gleichen Folgen. Siehe Synchronisierte Wrapper.ConcurrentHashMap
ist völlig nutzlosHier ist eine Methode, die es tun können für jede Enum, und ist der groß-und Kleinschreibung.
equalsIgnoreCase
ist der Weg zu gehen. +1Mit
Blah.valueOf(string)
ist am besten, aber Sie könnenEnum.valueOf(Blah.class, string)
als gut.Wenn Sie nicht wollen, schreiben Sie Ihre eigenen Dienstprogramm verwenden Sie das Google Guave - Bibliothek:
Im Gegensatz zu den eingebauten java-Funktion können Sie überprüfen, ob Eine vorhanden ist bla bla Bla und nicht eine Ausnahme werfen.
Meine 2 Cent hier: mit Java8-Streams + überprüfung einer exakten Zeichenfolge:
** EDIT **
Umbenannt die Funktion
fromString()
seit der Benennung mit dieser Konvention, Sie erhalten einige Vorteile aus Java-Sprache selbst; zum Beispiel:switch
- Blöcke, können Sie.orElse(null)
statt.orElseThrow()
so dass Sie kann code, der die exception werfen in derdefault
- Klausel, sowie weitere nützliche Informationen, wenn erforderlich. Zu machen, und mehr Nachsicht, die Sie nutzen könntenv -> Objects.equals(v.name, s == null ? "" : s.trim().toUpperCase())
Optional
ausfindFirst()
, so dass der Benutzer entscheiden, ob er will.orElse(null)
,orElseThrow()
oder was auch immer....public static MyEnum valueOf(String)
ist eigentlich ein Kompilierungsfehler, da es der gleiche ist wie der implizit definiert, also die ältere version Ihrer Antwort, die eigentlich besser ist. (jls, ideone)In Java 8 oder höher, mit Streams:
Müssen Sie möglicherweise dieses :
Einer Mehr Dazu :
Diese werden Sie wieder den Wert von a Stringified Enum-Name Für z.B., wenn Sie "PERSON" in der fromEnumName werde zurückkehren du den Wert des Enum-d.h. "Person"
Einen anderen Weg, dies zu tun durch die Verwendung von impliziten statische Methode
name()
von Enum. Namen zurück, die die exakte Zeichenkette zu erstellen, die enum, die verwendet werden können, zu überprüfen, vorausgesetzt string:Testen:
System.out.println(Blah.getEnum("B").name());
inspiration: 10 Beispiele von Enum in Java
valueOf
für Sie tut. Diese statische Methode nicht bieten nichts extra, ausser et all. Dann die if/else-Konstrukte sind sehr gefährlich ... keine neuen enum-Konstanten Hinzugefügt, wird diese Methode zu brechen, ohne Veränderung.name()
ist nicht statisch.Lösung mit Guava Bibliotheken. Methode getPlanet () ist die groß-und Kleinschreibung, so
getPlanet ("MerCUrY") zurück Planeten.QUECKSILBER.
Hinzufügen, um die vorherigen Antworten und Adresse einige der Diskussionen rund um Nullen und NPE-ich bin mit Guave Optionen zu behandeln fehlend/ungültig Fällen. Dies funktioniert gut für URI/parameter Parsen.
Für diejenigen, die nicht bewusst sind, hier sind einige mehr info auf die Vermeidung von null-mit Optional: https://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained#Optional
In Java 8 statische Karte Muster ist noch leichter und ist meine bevorzugte Methode. Wenn Sie möchten, verwenden Sie die Enum mit Jackson können Sie toString überschreiben und verwenden Sie stattdessen den Namen, das dann kommentieren mit
@JsonValue
O(1) - Methode, inspiriert von Sparsamkeit generierten code mit der Verwendung einer hashmap.
java.lang.Enum
definiert mehrere Methoden, die verfügbar ist, um alle Aufzählungstyp in Java:name()
Methode, um Namen einer Enum-Konstanten. String-literal verwendet, um zu schreiben enum-Konstanten ist Ihr name.values()
Methode kann verwendet werden, um ein array aller Enum-Konstanten aus der Enum-Typ.valueOf()
Methode zur Umwandlung von String zu Enum-Konstanten in Java, wie unten gezeigt.In diesem code-snippet,
valueOf()
Methode liefert einen Enum-Konstante Geschlecht.MÄNNLICH, ruft Namen auf, die zurück"MALE"
.Apache commons-lang Bibliothek hat eine statische Funktion org.apache.Unterhaus.lang3.EnumUtils.getEnum die Karte eine Zeichenfolge, um Ihre Enum-Typ. Gleiche Antwort im wesentlichen als Geoffreys aber warum Rollen Sie Ihre eigenen, wenn es dort draußen in der wildnis schon.
Hinzufügen zu den top bewerteten Antwort, eine hilfreiche utility...
valueOf()
wirft zwei verschiedenen Ausnahmen in Fällen, wo es nicht wie die Eingabe.IllegalArgumentException
NullPointerExeption
Wenn Ihre Anforderungen sind, so dass Sie don ' T haben keine Garantie, dass Ihr String wird auf jeden Fall mit einer enum-Wert, zum Beispiel, wenn die Zeichenfolge von Daten aus einer Datenbank kommt und könnte enthalten alte version des enum ist, dann benötigen Sie für die Handhabung dieser oft...
So, hier ist eine wiederverwendbare Methode, die ich schrieb, was uns ermöglicht, definieren Sie einen Standard-Enum werden zurückgegeben, wenn der String übergeben wir nicht übereinstimmen.
Verwenden Sie es wie diese:
Was?
Einem anderen Programm erfassen in umgekehrter Weise. Mit einem Wert erkennen, dass Enum nicht von seinem Namen.
Beispiel:
EnumUtil.from(Foo.class, "drei")
zurückFoo.THREE
, da wird es mitgetValue
zu entsprechen, "drei", das ist einzigartig öffentlichkeit, nicht endgültig und nicht statische Methode Foo.Im Fall Foo hat mehr als auf öffentlichen, nicht endgültig und nicht statische Methode, zum Beispiel
getTranslate
gibt "drei", die andere Methode, die verwendet werden können:EnumUtil.from(Foo.class, "drei", "getTranslate")
.Als
switch
-version noch nicht angesprochen wurde-ich Stelle Sie (die Wiederverwendung von OP ' s enum):Da diese keine zusätzlichen Wert für das
valueOf(String name)
Methode, es macht nur Sinn, definieren Sie eine zusätzliche Methode, wenn wir wollen, haben ein anderes Verhalten. Wenn wir nicht wollen, um eineIllegalArgumentException
wir können ändern Sie die Implementierung an:Durch die Bereitstellung einer default-Wert wir halten die Vertrag von
Enum.valueOf(String name)
ohne auslösen einerIllegalArgumentException
auf diese Weise, dass in keinem Fallnull
zurückgegeben. Daher werfen wir einenNullPointerException
wenn der namenull
- und im Fall derdefault
wenndefaultValue
istnull
. Das ist, wievalueOfOrDefault
funktioniert.Dieser Ansatz nimmt das design der
Map
-Schnittstelle bietet eine MethodeMap.getOrDefault(Object key, V defaultValue)
ab Java 8.Enum ist sehr nützlich, ich habe mit
Enum
eine Menge, um eine Beschreibung hinzuzufügen für einige Felder in verschiedenen Sprachen, wie im folgenden Beispiel:Dann können Sie den Abruf dynamisch mit Sitz in der language-code übergeben
getDescription(String lang)
Methode, zum Beispiel:Ich mag diese Art von Prozess zu analysieren Befehle als strings in Aufzählungen. Normalerweise habe ich eine der Enumerationen als "unbekannt", so dass es hilft, die zurückgegeben werden, wenn der andere nicht zu finden sind (auch auf groß-und Kleinschreibung-basis) anstatt null (dass es also keinen Wert). Daher habe ich diesen Ansatz verwenden.
Schnellste Weg, um den Namen der enum ist, eine map zu erstellen enum text und Wert, wenn Sie die Anwendung starten, und, um den Namen rufen Sie die Funktion bla bla Bla.getEnumName():