Java:用枚举替换switch case字符串常量失败,求解决方法
如何用枚举替代Switch Case中的字符串常量?
我有一段通过匹配item.getToString()返回的字符串常量(如"XS")执行逻辑的switch case代码,希望用枚举替代这些字符串常量。我定义了TShirtSize枚举,但尝试用TShirtSize.XS.getValue()替代字符串常量时未被识别。相关代码如下:
原Switch代码
switch (item.getToString()) { case "XS": estimatedTimes.add(3.5); break; case "S": estimatedTimes.add(10.5); break; case "M": estimatedTimes.add(17.5); break; case "L": estimatedTimes.add(28.0); break; case "XL": estimatedTimes.add(45.5); break; }
枚举类代码
public enum TShirtSize { XS("XS"), S("S"), M("M"), L("L"), XL("XL"); private final String value; TShirtSize(String value) { this.value = value; } public String getValue() { return value; } }
Item类代码
@Getter @Setter public static class Item { private String fromString; private String toString; }
尝试修改后的错误代码
switch (item.getToString()) { case TShirtSize.XS.getValue(): estimatedTimes.add(3.5); break; // 其他case... }
正确实现方式
核心原因:原来的写法不符合Java语法要求
Java规定switch的case标签必须是编译时常量,而TShirtSize.XS.getValue()是方法调用,编译器不会将其视为编译时常量,因此无法作为case标签使用。
推荐方案:将Switch表达式转为枚举类型
这种方式既能利用枚举的类型安全优势,又能解决case标签的问题,步骤如下:
1. 给枚举添加字符串转枚举的静态方法
修改TShirtSize枚举,增加一个根据字符串值获取对应枚举实例的方法,同时处理非法输入的情况:
public enum TShirtSize { XS("XS"), S("S"), M("M"), L("L"), XL("XL"); private final String value; TShirtSize(String value) { this.value = value; } public String getValue() { return value; } // 新增:根据字符串值转换为枚举实例 public static TShirtSize fromValue(String value) { for (TShirtSize size : TShirtSize.values()) { if (size.value.equals(value)) { return size; } } // 可根据业务需求抛出异常或返回默认值 throw new IllegalArgumentException("未知T恤尺码: " + value); } }
2. 修改Switch逻辑
先把字符串转换为枚举实例,再直接对枚举进行switch匹配:
// 先将字符串转为枚举 TShirtSize size = TShirtSize.fromValue(item.getToString()); switch (size) { case XS: estimatedTimes.add(3.5); break; case S: estimatedTimes.add(10.5); break; case M: estimatedTimes.add(17.5); break; case L: estimatedTimes.add(28.0); break; case XL: estimatedTimes.add(45.5); break; // 可选:处理未定义的枚举情况,或依赖fromValue的异常处理 }
备选方案(不推荐):保留字符串Switch,用枚举常量替代字符串
如果不想修改Switch的表达式类型,可以在枚举中定义公开的静态字符串常量,这样就能作为case标签使用:
public enum TShirtSize { XS, S, M, L, XL; public static final String XS_VALUE = "XS"; public static final String S_VALUE = "S"; public static final String M_VALUE = "M"; public static final String L_VALUE = "L"; public static final String XL_VALUE = "XL"; }
然后修改Switch代码:
switch (item.getToString()) { case TShirtSize.XS_VALUE: estimatedTimes.add(3.5); break; case TShirtSize.S_VALUE: estimatedTimes.add(10.5); break; // 其他case... }
这种方式虽然能解决问题,但失去了枚举的类型安全特性,不是最优解。
内容的提问来源于stack exchange,提问作者Tindona
相关产品推荐
相关产品推荐

