Groß- / Kleinschreibung bei der Übereinstimmung einer Zeichenfolge mit einer Java-Enumeration
Java
bietet eine valueOf()
Methode für jeden Enum<T>
Objekt, um so eine enum
wie
public enum Day {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}
kann man eine lookup wie
Day day = Day.valueOf("Monday");
Wenn die Zeichenfolge übergeben, um valueOf()
nicht übereinstimmt (case sensitive) ein bestehendes Day
Wert, ein IllegalArgumentException
geworfen wird.
Dazu eine case-insensitive matching, die man schreiben kann eine benutzerdefinierte Methode innerhalb der Day
enum, z.B.
public static Day lookup(String day) {
for (Day d : Day.values()) {
if (d.name().equalsIgnoreCase(day)) {
return type;
}
}
return null;
}
Gibt es eine generische Art und Weise, ohne die Verwendung von Zwischenspeicherung der Werte oder andere zusätzliche Objekte, zu schreiben, eine statische lookup()
Methode wie oben, nur einmal (D. H., nicht für jede enum
), gegeben, dass die values()
Methode wird implizit Hinzugefügt, um die Enum<E>
Klasse zur compile-Zeit?
Die Signatur von einem solchen "generischen" lookup()
Methode wäre ähnlich der Enum.valueOf()
- Methode, D. H.:
public static <T extends Enum<T>> T lookup(Class<T> enumType, String name);
und es würde implementieren, die genau die Funktionalität des Day.lookup()
- Methode für alle enum
, ohne die Notwendigkeit zu re-schreiben die gleiche Methode, die für jeden enum
.
- Tag.valueOf(day.toUpperCase())
in Ihrem lookup-Methode InformationsquelleAutor der Frage PNS | 2015-02-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich immer die Besondere Mischung von Generika ein wenig tricky, aber so funktioniert es.
Beispiel
InformationsquelleAutor der Antwort Adam
Ich würde denken, der sicher einfachste Weg, es zu tun wäre:
Oder wenn Sie möchten, verwenden Sie das class-Objekt, dann:
InformationsquelleAutor der Antwort sprinter
Können Sie
Class
'sgetEnumConstants()
Methode, das gibt ein array mit allen enum-Typen, wenn dieClass
stellt ein enum, odernull
wenn nicht.Ihrer erweiterten for-Schleife Zeile würde wie folgt Aussehen:
InformationsquelleAutor der Antwort rgettman
Eine generische Lösung wäre keeo der Konvention, dass Konstanten werden in Großbuchstaben. (Oder in Ihrem speziellen Fall mit einem Kapital auf die look-up-string).
InformationsquelleAutor der Antwort Joop Eggen
Für Android und relativ kurz Enums, ich mache die einfache Schleife und vergleichen Sie den Namen ignorieren der Fall.
InformationsquelleAutor der Antwort Alen Siljak
Wahrscheinlich schreiben Sie eine utility-Klasse für das tun, als die folgenden.
Wäre es schön gewesen, wenn es eine Möglichkeit in Java, die für uns zu einer Verlängerung der Enum-Klasse implizit durch das hinzufügen von Methoden nur die Art und Weise Werte () - Methode Hinzugefügt, aber ich glaube nicht, dass es einen Weg gibt, das zu tun.
InformationsquelleAutor der Antwort Nandana
Ab version 3.8 apache-commons-lang EnumUtils hat zwei praktische Methoden:
getEnumIgnoreCase(final Class<E> enumClass, final String enumName)
isValidEnumIgnoreCase(final Class<E> enumClass, final String enumName)
InformationsquelleAutor der Antwort Enigo