2016-01-29 44 views
2

也许有人可以填补我的理解的差距: 我有一个看起来像这样的枚举:枚举不能得到解决

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

您正在尝试使用的情况下表达,这是Java非法的方法调用的结果,因为案件的标签需要常量表达式,它可以在编译时得到解决。方法调用的结果不是一个常量表达式,所以它不能用作案例标签。

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

+0

谢谢您的评论,我从来不知道这一点。 +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); 
    } 
} 

然后你可以使用该实用程序getById方法时,你需要得到相应的枚举例如,在提供的ID中,例如在switch语句中:

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