Kann ich eine enum-basierend auf dem Wert aus dem Feld?
Möchte ich, um eine bestimmte enum-basierend auf seinem Feld Wert.
Enum:
public enum CrimeCategory {
ASBO ("Anti Social Behaviour"),
BURG ("Burglary"),
CRIMDAM ("Criminal Damage And Arson"),
DRUGS ("Drugs"),
OTHTHEFT ("Other Theft"),
PUPDISOR ("Public Disorder And Weapons"),
ROBBERY ("Robbery"),
SHOPLIF ("Shoplifting"),
VEHICLE ("Vehicle Crime"),
VIOLENT ("Violent Crime"),
OTHER ("Other Crime");
private String category;
private CrimeCategory (String category) {
this.category = category;
}
public String returnString() {
return category;
}
}
Bekommen ein neues Enum:
aStringRecivedFromJson = "Anti Social Behaviour"
CrimeCategory crimeCategoryEnum;
crimeCategoryEnum = CrimeCategory.valueOf(aStringRecivedFromJson);
Ich habe versucht, herauszufinden, einen Weg für die oben wieder ein enum, damit es weitergegeben werden kann, gespeichert in einer HashMap
mit anderen Crime
Informationen.
Erwartete Ergebnis: ASBO
- toString() geben Sie eine String-Darstellung der Enum-es sei denn, Sie überschreiben.
- fyi, du bist nicht wirklich 'initialisiert eine neue enum' mit dem Beispiel-code. Können Sie das nicht tun, in der Tat, da Enumerationen in Java sind effektiv singletons. Sie wirklich suchen, eine bestehende enum-Wert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Referenz, hier ist eine alternative Lösung mit einer HashMap:
HashMap
wenn die Kategorie Wert wird öfter aufgerufen. Derzeit sind seine nur aufgerufen, wenn ein map-marker geklickt wird, so ist die Leistung derzeit okFügen Sie eine statische Methode, um die
CrimeCategory
enum:Map
ist ein statisches Feld derenum
wird NPE. (Lösungen: Setzen Sie die statische in eine geschachtelte Klasse oder eine Schleife durchvalue()
in einem static initialiser setzen Sie in die Karte.)Statische factory-Methoden, die eine enum-Konstanten, basierend auf dem Wert einer Instanz-Feld in einer der beiden Formen, beschrieben in den anderen Antworten: die Lösung basiert auf der Iteration der enum-Werte oder eine Lösung basierend auf einem
HashMap
.Für Enumerationen, die mit einer kleinen Anzahl von Konstanten, die iterative Lösung sollte so performant wie die
HashMap
Lösung (die erfordert die Berechnung der hash-code ist, passt es in einen Eimer, und vorausgesetzt, es werden keine hash-Kollisionen).Für größere enums, die map-basierten Lösung werden immer leistungsstärker (aber erfordert Speicherplatz im Speicher). Allerdings, wenn die factory-Methode aufgerufen wird, wird selten dann die Allgemeine Verbesserung der performance mit einer Karte könnte noch unendlich klein.
Die Allgemeine Entscheidung für eine iterative lookup-oder eine map-basierten Suche für die statische factory-Methode wird hängt letztendlich von deinen Anforderungen und der Umgebung. Es ist nie falsch, mit zu beginnen eine iterative lookup-und dann ändern, um eine map-basierte Implementierung, wenn die Profilerstellung zeigt eine aktuelle performance-problem.
Schließlich, seit Java 8, die
Streams
API ermöglicht eine pipeline-basierte Lösung für die Kartierung (das sollte die Leistung ähnlich der iterativen Lösung). Zum Beispiel, sagen, dass Sie möchten, erstellen Sie eine Schnittstelle, die Sie verwenden, auf jede enum-Klasse, drücken Sie Ihre Absicht, dass es sein sollte matchable durch eine eigene Instanz-Felder. Nennen wir diese SchnittstelleMatchable
. Dieses interface definiert eine Methode gibt die Instanz-Feld, welches Sie anpassen möchten (zB.getField()
). Diese Schnittstelle kann auch definieren Sie eine statische factory-Methode zum zurückgeben einer Konstante von jeder Implementierung von enum-Klasse:Nun, jeder enum-Klasse, die Sie definieren, die
Matchable
können dieMatchable.forToken()
statische factory-Methode, um die enum-Konstanten, deren Instanz-Feld dem Wert entspricht, den angegebenen parameter.Den generischen Typ-Deklaration
E extends Enum<E> & Matchable
versichert, dass die type-token übergeben werden der Methode als parameter werden für eine enum-Klasse, dieMatchable
(sonst wird der code nicht kompiliert).