Как использовать ENUM с SWITCH, для сравнения на основе строк - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть класс Enum, как показано ниже.

public enum TestEnum {
    TEST1("test1"), TEST2("test2");

    private String name;
    TestEnum(String name) {
        this.name= name;
    }
    public String getName(){
        return name;
    }
}

Я пытаюсь использовать его в операторе SWITCH для сравнения со строкой, но не могу использовать.Смотрите скриншот ниже, я вижу только вариант .class.И я очень удивлен, потому что в одном другом окне я могу видеть значения.

enter image description here

Теперь, еще одна проблема, с которой я, скажем,чтобы увидеть значения, я хочу сделать case TestEnum.TEST1.getName():, чтобы он мог работать с оператором switch, но здесь я получаю сообщение об ошибке, утверждая, что для регистра переключателя допускаются только константы.

Может кто-нибудь помочь с этим.По сути, я хочу, чтобы вместо проверки строки по числу возможных строк, таких как «test1» или «test2», я хочу сделать это с помощью SWITCH.

В качестве отступления у меня есть 32 блока IF-ELSEIF,кто-то сказал мне, что я должен вместо этого использовать SWTICH, это плохо, если я использую 32 блока IF-ELSEIF.

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Вы можете создать свой собственный метод для преобразования строкового значения в ваше перечисление.

Например, я всегда использую такой подход:

public enum TestEnum {
    // Enum constants
    // Enum fields, constructors, etc..

    public static TestEnum fromName(String name) {
        return Arrays.stream(values())
            .filter(e -> e.name.equals(name))
            .findFirst()
            .orElse(null);
    }
}

Теперь полученное в результате перечисление можно использовать в операторе switch

0 голосов
/ 01 февраля 2019

Вы можете рассмотреть возможность использования String констант вместо Enum.Например:

public class TestEnum {

    private static final String TEST1 = "test1";
    private static final String TEST2 = "test2";

}

можно затем использовать в операторе switch следующим образом:

switch(name) {
    case TestEnum.TEST1:
        break;
    case TestEnum.TEST2:
        break;
    default:
        break;
}

После завершения в вашей среде IDE вы должны получить параметры TEST, TEST2, ...

0 голосов
/ 01 февраля 2019

Метки делений являются постоянными.Попробуйте добавить статический метод в класс enum:

public enum TestEnum {
    TEST1("test1"), TEST2("test2");

    private String name;
    TestEnum(String name) {
        this.name= name;
    }
    public String getName(){
        return name;
    }
    public static TestEnum fromName(String name) {
        for (TestEnum e: values()) {
            if (e.name.equals(name)) {
                return e;
            }
        }
        throw new IllegalArgumentException("Name not found: " + name);
    }
}

После этого вы сможете написать оператор switch:

switch (TestEnum.fromName(name)) {
case TEST1:
    //...
    break;
case TEST2:
    //...
    break;
}
...