如何在switch case中使用枚举类

4
我正在翻译这段英文:

在尝试使用枚举类的 switch case 语句时,我遇到了错误 - case 表达式必须是常量表达式

我的枚举类如下:

public enum TestEnumClass {

    TEST1("TEST1"),
    TEST2("TEST2"),
    TEST3("TEST3");

    private String enumConstant;

    private TestEnumClass(String algoConstant) {
        this.enumConstant = algoConstant;
    }

    public String getEnumConstant() {
        return enumConstant;
    } 
}

尝试在另一个类文件中使用枚举 TestEnumClass,代码如下:
public class TestIndexOf {

    public static void main(String[] args) {


        String str = args[0];

        switch(str){

        case TestEnumClass.Test1.getEnumConstant() : System.out.println("test1"); break;

        case TestEnumClass.Test2.getEnumConstant() : System.out.println("test2"); break;

        }
    }
}

它给我编译时错误:
case表达式必须是常量表达式
请建议我,我哪里做错了。

4
您要检查的值需要是在编译时已知的常量。即使在这种情况下它没有改变,TestEnumClass.Test1.getEnumConstant()也不被认为是常量。 - resueman
谢谢提供信息,那么我该如何使用呢?将枚举移动到静态常量是唯一的方法吗?但我只想使用枚举.. 有什么办法吗? - user3932793
1
您有几个选择。您可以使用final static String,您可以使用if而不是switch,或者您可以在TestEnumClass.valueOf(str)上切换,并将case作为枚举值本身。 - resueman
3个回答

6

在switch语句中,您不能使用方法的结果作为case。Switch语句针对常量情况进行了优化。Enums非常适合此类情况,但是您需要具有:

TestEnumClass value = TestEnumClass.valueOf(str);

switch (value) {
    case TEST1: ...
    case TEST2: ...
}

1
非常感谢。已更改如下,并且运行良好:TestEnumClass str = TestEnumClass.valueOf(args[0]); switch(str){ case TEST1 : System.out.println("test1"); break; case TEST2 : System.out.println("test2"); break; } - user3932793

1

你的 switch 表达式是一个 String,你需要将其更改为 TestEnumClass 类型的变量


1
然后将 case 标签更改为 TEST1TEST2TEST3 - 5gon12eder

1
你正在对 String 进行 switch,但是根据 JLScase TestEnumClass.TEST1.getEnumConstant() 不是编译时常量。一个 case 语句需要一个编译时常量值。为了纠正这个错误,你可以这样做。
String str = args[0];

TestEnumClass e = TestEnumClass.valueOf(str);

switch(e){

case TEST1: System.out.println("test1"); break;

case TEST2 : System.out.println("test2"); break;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接