Поскольку switch
-версия еще не упомянута, я представляю ее (повторное использование перечисления 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);
}
}
}
Поскольку это не дает никакого дополнительного значения методу valueOf(String name)
, имеет смысл определить дополнительный метод, только если мы хотим иметь другое поведение. Если мы не хотим поднять IllegalArgumentException
, мы можем изменить реализацию на:
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;
}
}
}
Предоставляя значение по умолчанию, мы сохраняем контракт в Enum.valueOf(String name)
без выброса IllegalArgumentException
таким образом, что ни в коем случае null
не возвращается. Поэтому мы бросаем NullPointerException
, если имя null
, а в случае default
, если defaultValue
- null
. Вот так valueOfOrDefault
работает.
Этот подход принимает дизайн Map
-интерфейса, который обеспечивает метод Map.getOrDefault(Object key, V defaultValue)
с Java 8.