问题
项目中出现了需要结合使用Switch和Enum的情况,按照平常思路编写代码后发现无法通过编译,如下列代码所示(只保留关键部分)
枚举类Constant代码如下
public enum Constant {
//无关部分省略
SELECT("select"),
private String value;
Constant(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
Switch部分如下,此处表达式为普通字符串类型数据
switch (mappedStatement.getSqlCommandType()){//expression为String类型数据
case Constant.SELECT.getValue():{
//无关代码省略
}
default:{
break;
}
}
笔者开发环境为JDK8,不存在表达式不支持String类型的情况,但在expression和case同为String类型的情况下却不能通过编译,在case处爆红,悬浮提示为Constant expression required,编译失败提示为Error:(33, 42) java: 需要常量字符串表达式。
出现这种情况的原因是switch的case只能使用常量,即case的值必须是在编译时就能识别的量,而非执行过程。
必须使用枚举类的解决方法
在枚举类中加入类型转换方法
public static Constant stringToEnum (String str) {
//此处values方法是自动生成的 在编译器和API中都无法找到 常用于枚举类遍历操作
for(Constant constant:values()){
if(constant.value.equals(str)){
return constant;
}
}
return null;
}
使用转换方法将switch的expression转换为Constant类
switch (Constant.stringToEnum(mappedStatement.getSqlCommandType())){
case SELECT:{
//代码省略
}
default:{
break;
}
}
更改后代码编译通过,正常运行
本篇用于记录踩坑
作者才疏学浅,如文中出现纰漏,还望指正