无法解析“切换语句”中的枚举

时间:2016-01-29 18:44:01

标签: java enums switch-statement

也许有人可以填补我的理解空白: 我有一个看起来像这样的枚举:

enum MyEnum {

    VALUE_1("id1", "name"),
    VALUE_2("id2", "name")

    ...
}

当我在我的代码中执行此操作时,它可以正常工作:

if(MyEnum.VALUE_1.getId().equals(someVar)) {

}

但是,这不会编译

switch (someVar) {

    case MyEnum.VALUE_1.getId():
    ...
}

IDE抱怨无法解析MyEnum

为什么?

2 个答案:

答案 0 :(得分:2)

您正在尝试在case表达式中使用方法调用的结果,这在Java中是非法的,因为case标签需要常量表达式,可以在编译时解析。方法调用的结果不是常量表达式,因此不能用作案例标签。

您必须使用if声明;它不需要一个恒定的表达式。

答案 1 :(得分:0)

必须在case标签中使用常量,因此不允许进行方法调用。然而,为了能够使用switch语句并使代码更具可读性,您可以实现以下内容:

enum MyEnum {

    VALUE_1("id1", "name"),
    VALUE_2("id2", "name"),
    ...

    private static final Map<String, MyEnum> instances = new HashMap<>();

    static {
        for (MyEnum myEnum : values()) {
            instances.put(myEnum.getId(), myEnum);
        }
    }

    public static MyEnum getById(String id) {
        return instances.get(id);
    }
}

然后,只要需要为提供的id获取相应的枚举实例,就可以使用实用程序getById方法,例如在switch语句中:

switch (MyEnum.getById(someVar)) {
    case VALUE_1:
    ...
}