Prüft, ob der Enum-Typ eine Konstante mit dem angegebenen Namen enthält

7

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?

    
BugsPray 27.07.2011, 20:12
quelle

3 Antworten

8

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%     
jjnguy 27.07.2011, 20:22
quelle
10

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.

    
Paŭlo Ebermann 27.07.2011 20:22
quelle
3

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:

%Vor%

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.

    
Paŭlo Ebermann 27.07.2011 21:18
quelle

Tags und Links