#java #spring-boot
#java #spring-boot
Вопрос:
Предположим, у меня есть класс enum из
public enum ValueType {
time("15"),
post("15"),
comment("F"),
private final String valueType;
ValueType(final String valueType) {
this.valueType = valueType;
};
public String getValueType() {
return this.valueType;
}
}
и я получаю значение константы, используя
ValueType.valueOf(dynamicValueString).getValueType()
Предполагается, что для этого dynamicValueString нет константы перечисления.
Как я могу присвоить значение пустой строке, если перечисление не найдено? без использования try catch?
Комментарии:
1. Почему без
try
—catch
?2. Сохраняйте частные статические
HashMap
строковые значения для их ключей перечисления и используйте #getOrDefau< то есть, если это действительно ваше узкое место в производительности. Вы хотели бы создать новый метод без исключений для получения константы для этого. Однако я думаю, что необязательный возврат ornull
был бы намного лучше, потому что пустая строка не будет принудительно обрабатываться или с треском проваливаться, если она не обрабатывается через NPE (соответственно). NPE указывает, что у вас где-то ошибка кода, вы никогда не должны скрывать ошибку, а вместо этого исправлять ее
Ответ №1:
Я бы сказал, что вы правы, избегая исключений для обычного потока программы. В любом случае, я использую карту, как предложено в комментарии:
public enum TestType {
ONE("1"),
TWO("2"),
THREE("3");
private final String str;
TestType(String str) {
this.str = str;
}
private static final Map<String, TestType> MAP = Arrays.stream(values())
.collect(Collectors.toMap(TestType::name, Function.identity()));
public static String typeByName(String name) {
TestType type = MAP.get(name);
return type == null ? "" : type.str;
}
}
Ответ №2:
public enum ValueType {
time("15"),
post("15"),
comment("F");
private final String valueType;
ValueType(final String valueType) {
this.valueType = valueType;
}
public String getValueType() {
return this.valueType;
}
public static String getValueType(String name) {
return Arrays.stream(ValueType.values())
.filter(v -> name.equalsIgnoreCase(v.valueType))
.findFirst()
.map(v -> v.valueType)
.orElse("");
}
}
Комментарии:
1. Как я могу это использовать? Потому что я получаю только пустую строку
2. метод работает нормально, он возвращает string ValueType другой строкой или пустой строкой
Ответ №3:
Вам необходимо реализовать пользовательский поиск в вашем перечислении:
public enum ValueType {
//...
public static String lookupValueType(String constant) {
try {
return ValueType.valueOf(constant).valueType;
} catch (IllegalArgumentException e) {
return "";
}
}
}
И просто используйте ValueType.lookupValueType(dynamicValueString)
(я предполагаю dynamicValueString
, что это соответствует именам значений перечисления)