问题
项目中出现了需要结合使用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;
}
}
更改后代码编译通过,正常运行
本篇用于记录踩坑
作者才疏学浅,如文中出现纰漏,还望指正
本文记录了一位开发者在使用Java枚举与Switch语句时遇到的问题。由于Java的Switch不支持直接使用枚举方法的返回值作为case条件,导致编译错误。为解决此问题,开发者在枚举类中添加了类型转换方法,将字符串转换为枚举实例,然后在Switch语句中使用转换后的枚举实例,成功通过编译并正常运行。这个案例对于理解Java枚举特性和Switch语句的限制具有参考价值。
2812





