Ich habe mehrere enums in meinem Code:
%Vor%Ich möchte eine Methode haben, die mit valueOf () prüft, ob ein Wert in einer enum vorhanden ist, ohne einen für jeden Enum-Typ zu schreiben. Zum Beispiel (dieser Code läuft nicht):
%Vor%Verwendung:
%Vor%Irgendwelche Ideen, wie man so etwas macht?
Hier ist Ihre Lösung:
%Vor%Er ruft alle Variablen und Checks der Enumeration ab, um zu sehen, ob sie einen Wert haben, der einen Namen mit dem übergebenen Parameter teilt. Wenn dies der Fall ist, wird true zurückgegeben, andernfalls wird false zurückgegeben.
Dies wurde getestet und funktioniert. Testcode:
%Vor%Drucke:
%Vor%Das sollte funktionieren:
%Vor%Sie müssen es dann mit
aufrufen %Vor% Ich bin mir nicht sicher, ob das einfache Durchsuchen der Werte (wie in der Antwort von jinguy) schneller ist als das Erstellen und Auslösen einer Ausnahme. Dies hängt davon ab, wie oft false
abgerufen wird, wie viele Konstanten Sie haben und wie lang der Stack-Trace ist (z. B. wie tief dieser bezeichnet wird).
Wenn Sie dies oft (für die gleiche Enumeration) benötigen, ist es möglicherweise besser, einmal ein HashSet oder eine HashMap zu erstellen, die die Namen den enum-Werten zuordnen.
Ich habe eine andere Variante gefunden, die weder alle Enum-Konstanten durchlaufen noch eine Exception auslösen muss ... aber sie ist implementierungsspezifisch, d. h. verwendet nicht dokumentierte Methoden. Es funktioniert für Suns JDK 1.6.0_20 (und wurde durch Lesen des Quellcodes von 1.6.0_13 erstellt).
%Vor% Wenn wir im Paket java.lang
wären, könnte das einfach so aussehen:
Dies verwendet die Methode Class.enumConstantDirectory()
, die (beim ersten Aufruf) erstellt und (später) eine Map mit allen Enum-Konstanten als Werte und deren Namen als Schlüssel zurückgibt. (Genau so eine Karte könnte man auch manuell erstellen.)
Diese Methode wird intern von Enum.valueOf(Class, String)
und vermutlich auch von EnumType.valueOf(String)
(abhängig vom Compiler) verwendet.
Beim ersten Aufruf von enumConstantDirectory
oder getEnumConstants()
ruft eine private Hilfsmethode EnumType.values()
auf (was vom Compiler implementiert wird). Das Ergebnis wird dann für die folgenden Aufrufe dieser beiden Methoden wiederverwendet.