Comme une switchversion-n'a pas encore été mentionnée, je l'introduis (en réutilisant l'énumération 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);
}
}
}
Comme cela ne donne aucune valeur supplémentaire à la valueOf(String name)méthode, il est logique de définir une méthode supplémentaire si nous voulons avoir un comportement différent. Si nous ne voulons pas augmenter un, IllegalArgumentExceptionnous pouvons changer l'implémentation en:
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;
}
}
}
En fournissant une valeur par défaut, nous conservons le contrat de Enum.valueOf(String name)sans en lancer un IllegalArgumentException de cette manière qui en aucun cas nulln'est retourné. Par conséquent, nous lançons un NullPointerExceptionsi le nom est nullet en cas de defaultsi defaultValueest null. Voilà comment ça valueOfOrDefaultmarche.
Cette approche adopte la conception de Map-Interface qui fournit une méthode à Map.getOrDefault(Object key, V defaultValue)partir de Java 8.
Blah.valueOf("A")méthode est sensible à la casse et ne tolère pas les espaces étrangers, d'où la solution alternative proposée ci-dessous par @ JoséMi.