【问题标题】:Enums in Switch Statements cannot be resolvedSwitch 语句中的枚举无法解析
【发布时间】:2016-01-29 18:44:01
【问题描述】:

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

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 无法解析。

为什么会这样?

【问题讨论】:

    标签: java enums switch-statement


    【解决方案1】:

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

    您必须使用您的if 声明;它不需要常量表达式。

    【讨论】:

    • 谢谢你的评论,我从来不知道。 +1
    【解决方案2】:

    您必须在 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:
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多