Comme une switch
version-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, IllegalArgumentException
nous 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 null
n'est retourné. Par conséquent, nous lançons un NullPointerException
si le nom est null
et en cas de default
si defaultValue
est null
. Voilà comment ça valueOfOrDefault
marche.
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.