Возврат пустой строки, если константа перечисления не найдена

#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< то есть, если это действительно ваше узкое место в производительности. Вы хотели бы создать новый метод без исключений для получения константы для этого. Однако я думаю, что необязательный возврат or null был бы намного лучше, потому что пустая строка не будет принудительно обрабатываться или с треском проваливаться, если она не обрабатывается через 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 , что это соответствует именам значений перечисления)