首页 > 解决方案 > 将 Enum 与 switch 语句一起使用:需要常量表达式错误

问题描述

我定义了一个枚举类“TestEnvEnum”,并定义了一个调用枚举类的类“ConfigInit”。

public enum TestEnvEnum {
    ENV1("devEnv1"),
    ENV2("devEnv2"),
    ENV3("devEnv3");

    private final String name;

    TestEnvEnum(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return name;
    }
}


public class ConfigInit {
    static String envIndex = "1";
    static String envProps = System.getProperties().getProperty("env");
    public static void scfInit() {
        switch (envProps) {
            case TestEnvEnum.ENV2.name():  //error: Constant expression required
                envIndex = "2";
                break;
            case TestEnvEnum.ENV3.name():  //error: Constant expression required
                envIndex = "3";
                break;
            default:
                envIndex = "1";
        }
    }
}

问题:如果我使用 Enum,那么 case TestEnvEnum.ENV2.name() 和 case TestEnvEnum.ENV3.name() 会提示“需要常量表达式”。

如果我将它们更改为“devEnv2”和“devEnv3”,程序将正确运行。

我想知道我应该如何在我的程序中使用 Enum 来避免这样的错误。请帮助我。

标签: java

解决方案


你可以把它改成这样:

public enum TestEnvEnum {
    ENV1("devEnv1"),
    ENV2("devEnv2"),
    ENV3("devEnv3");

    private final String name;

    TestEnvEnum(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return name;
    }

    public static TestEnvEnum byName(String name) { //You may change the return type to Optional<TestEnvEnum> to avoid NPE
        for (TestEnvEnum value : values()) {
            if(value.getName().equals(name)) { //equalsIgnoreCase should be used if you don't care about the capitalization
                return value;
            }
        }
        return null;
    }
}

public class ConfigInit {
    static String envIndex = "1";
    static String envProps = System.getProperties().getProperty("env");
    public static void scfInit() {
        TestEnvEnum testEnvEnum = TestEnvEnum.byName(envProps);
        switch (testEnvEnum) {
            case ENV2:
                envIndex = "2";
                break;
            case ENV3:
                envIndex = "3";
                break;
            default:
                envIndex = "1";
        }
    }
}

我建议您在这里阅读这篇文章,它很好地解释了为什么会发生这种情况。


推荐阅读