Поскольку 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
-Interface, который обеспечивает метод Map.getOrDefault(Object key, V defaultValue)
с Java 8.
Blah.valueOf("A")
метод чувствителен к регистру и не допускает посторонних пробелов, поэтому альтернативное решение, предложенное ниже @ JoséMi.