也许有人可以填补我的理解空白: 我有一个看起来像这样的枚举:
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
。
为什么?
答案 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:
...
}