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, IllegalArgumentExceptionkö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 nullzurückgegeben wird. Deshalb werfen wir ein NullPointerExceptionif der Name ist nullund falls defaultif defaultValueist null. So valueOfOrDefaultfunktioniert 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.