如何将ENUM与SWITCH结合使用,以进行基于字符串的比较

时间:2019-02-01 10:16:17

标签: java switch-statement

我有一个如下的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语句一起使用,但是在这里我得到了错误,说只允许常量用于switch情况。

请有人帮忙。基本上,我想要的不是在字符串中对照“ test1”或“ test2”之类的可能字符串来检查字符串,而是要使用SWITCH来做到这一点。

顺便说一句,我有32个IF-ELSEIF块,有人告诉我应该改用SWTICH,因为我使用32个IF-ELSEIF块是不好的。

3 个答案:

答案 0 :(得分:1)

大小写标签是常量。 考虑在枚举类中添加静态方法:

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;
}

答案 1 :(得分:1)

您可以创建自己的方法以将字符串值转换为枚举。

例如,这是我经常使用的方法:

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语句中使用结果枚举

答案 2 :(得分:1)

您可以考虑使用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中的完成应为您提供选项TESTTEST2,...。