Переключите строку с переменными Enum - PullRequest
2 голосов
/ 19 июня 2019

Я получил Enum с другими значениями и хочу переключить строковую переменную. Теперь я врезался в стену, пытаясь преобразовать значения Enum в строки, которые я могу использовать в качестве константы регистра.

Моя лучшая попытка состояла в том, чтобы преобразовать Enum в массив String, но переключатель, похоже, не принимает значения массива в качестве константы регистра. (IntelliJ говорит: «требуется постоянное выражение»)

Enum myEnum = {FOO, BAR}

String input = "foo"

final String[] constant = Arrays.stream(myEnum.values()).map(Enum::name).toArray(String[]::new); 
//converts Enum to String[]; made it final, so it is "constant" 

       switch (input) {
                    case constant[0]:
                        System.out.println("foo");
                        break;
                    case constant[1]:
                        System.out.println("bar");
                        break;
                     }

Есть ли элегантный способ сделать этот переключатель зависимым от Enum?

Ответы [ 4 ]

3 голосов
/ 19 июня 2019

Вы не должны конвертировать его, потому что он не нужен. Кроме того, ваш код даже не скомпилируется, потому что case является зарезервированным ключевым словом в Java.

Вы должны взглянуть на valueOf метод Enum.

Ваш код может выглядеть так:

public enum MyEnum {FOO, BAR}

//method
String input = "foo";
MyEnum niceFound = MyEnum.valueOf(input.toUpperCase());

Это вернет FOO, но может выдать IllegalArgumentException, когда заданное значение отсутствует как тип.

3 голосов
/ 19 июня 2019

Вы можете сделать это:

public enum MyEnum {
    FOO("foo"),
    BAR("bar");

    private String value;

    public String getValue() {
        return value;
    }

    public static MyEnum getState(String value) {
        switch (value) {
            case "foo":
                return FOO;
            case "bar":
                return BAR;
        }
        return null;
    }

    private MyEnum(String value) {
        this.value = value;
    }
}

Теперь в вашем классе вы можете:

MyEnum myEnum = getState("foo"); // returns MyEnum.FOO

Также убедитесь, что вы обрабатываете случай, когда getState() возвращает null

1 голос
/ 19 июня 2019

Решением с потоками Java 8+ было бы создание метода внутри вашего перечисления:

public static Optional<MyEnum> getByValue(final String value) {
   return Arrays.stream(MyEnum.values())
              .filter(myEnum -> myEnum.value.equals(value))
              .findFirst();
}

Это возвращает необязательное значение, если для параметра String нет значения enum.Но вы можете изменить его в соответствии с вашими потребностями.

1 голос
/ 19 июня 2019

Использовать MyEnum.valueOf (value.toUpperCase ())

public enum MyEnum {
    FOO, BAR;
}

public static void process(String value) {
    try {
        switch (MyEnum.valueOf(value.toUpperCase())) {
            case FOO :
                System.out.println("FOO");
                break;
            case BAR :
                System.out.println("BAR");
                break;
            default :
                break;
        }
    }
    catch (IllegalArgumentException e) {
        // TODO: handle exception
    }

public static void main(String[] a){
    process("foo");
}
...