问题描述
在JDK1.8下使用switch...case...语句,switch条件为String类型,case值为枚举code取字符串。此时报编译错误:“Constant expression required”。
枚举类
@Getter
@AllArgsConstructor
public enum AEnum {
A("A", "Desc of A"),
B("B", "Desc of B"),
C("C", "Desc of C");
private String code;
private String desc;
// ...
}
switch...case...代码
// ...
String code = ...;
switch (code) {
case (): // 此处报"Constant expression required"
// 处理逻辑
break;
default:
// 处理逻辑
break;
}
// ...
原因分析
case的条件值必须得是常量(表达式)且case后的条件值不能重复(相同),而此时枚举getCode()获取的不是常量,且不同的枚举可以有相同的code。
@Getter
@AllArgsConstructor
public enum AEnum {
A("A", "Desc of A"),
B("B", "Desc of B"),
C("C", "Desc of C"),
C2("C", "Desc of C");
private String code;
private String desc;
// ...
}
解决方法
其一,枚举的分支判断应用如下方式
// ...
MyEnum enum = ...;
switch (enum) {
case A:
// 处理逻辑
break;
case C:
// 处理逻辑
break;
default:
// 处理逻辑
break;
}
// ...
其二,字段的分支判断要用常量
private final String aa = "aa";
private final String bb = "bb";
// ...
String code = ...;
switch (code) {
case aa:
// 处理逻辑
break;
case bb:
// 处理逻辑
break;
case "dd":
// 处理逻辑
break;
default:
// 处理逻辑
break;
}
// ...