Ponieważ switch
jeszcze nie wspomniano o -wersji, przedstawiam ją (ponownie wykorzystując wyliczenie 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);
}
}
}
Ponieważ nie daje to żadnej dodatkowej wartości valueOf(String name)
metodzie, sensowne jest zdefiniowanie dodatkowej metody, jeśli chcemy mieć inne zachowanie. Jeśli nie chcemy podnosić IllegalArgumentException
, możemy zmienić implementację na:
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;
}
}
}
Poprzez dostarczanie wartości domyślnej możemy utrzymać umowę o Enum.valueOf(String name)
bez rzucając IllegalArgumentException
w ten sposób, że w żadnym wypadku nie null
jest zwracana. Dlatego rzucamy a NullPointerException
jeśli nazwa jest, null
a default
jeśli defaultValue
jest null
. Tak to valueOfOrDefault
działa.
W tym podejściu przyjęto projekt Map
interfejsu, który zapewnia metodę Map.getOrDefault(Object key, V defaultValue)
od Java 8.
Blah.valueOf("A")
metodzie rozróżniana jest wielkość liter i nie toleruje obcych białych znaków, dlatego alternatywne rozwiązanie zaproponowane poniżej przez @ JoséMi.