Поскольку 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.