Da eine switch
-Version noch nicht erwähnt wurde, stelle ich sie vor (Wiederverwendung der Aufzählung von OP):
private enum Blah {
A, B, C, D;
public static Blah byName(String name) {
switch (name) {
case "A":
return A;
case "B":
return B;
case "C":
return C;
case "D":
return D;
default:
throw new IllegalArgumentException(
"No enum constant " + Blah.class.getCanonicalName() + "." + name);
}
}
}
Da dies der valueOf(String name)
Methode keinen zusätzlichen Wert verleiht , ist es nur dann sinnvoll, eine zusätzliche Methode zu definieren, wenn wir ein anderes Verhalten wünschen. Wenn wir keine erhöhen möchten, IllegalArgumentException
können wir die Implementierung ändern in:
private enum Blah {
A, B, C, D;
public static Blah valueOfOrDefault(String name, Blah defaultValue) {
switch (name) {
case "A":
return A;
case "B":
return B;
case "C":
return C;
case "D":
return D;
default:
if (defaultValue == null) {
throw new NullPointerException();
}
return defaultValue;
}
}
}
Durch die Angabe eines Standardwertes behalten wir den Vertrag bei, Enum.valueOf(String name)
ohne einen IllegalArgumentException
auf diese Weise zu werfen , der in keinem Fall null
zurückgegeben wird. Deshalb werfen wir ein NullPointerException
if der Name ist null
und falls default
if defaultValue
ist null
. So valueOfOrDefault
funktioniert es.
Dieser Ansatz übernimmt das Design der Map
-Interface, die eine Methode Map.getOrDefault(Object key, V defaultValue)
ab Java 8 bereitstellt .
Blah.valueOf("A")
Methode zwischen Groß- und Kleinschreibung und toleriert keine Leerzeichen, daher die unten von @ JoséMi vorgeschlagene alternative Lösung.