Ponieważ switchjeszcze 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 nulljest zwracana. Dlatego rzucamy a NullPointerExceptionjeśli nazwa jest, nulla defaultjeśli defaultValuejest null. Tak to valueOfOrDefaultdziała.
W tym podejściu przyjęto projekt Mapinterfejsu, 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.