如何使用自定义Java枚举优化整数字符串映射场景的if-else逻辑
可以,完全可以用你定义的枚举彻底替换掉这段冗长的if-else判断
首先提一句你贴的枚举代码有个小笔误:你写的string2(3)和原逻辑里var == 3对应string3的映射不匹配,应该调整为string3(3)。
完整的枚举实现只需要补全字段、构造方法、值查找逻辑即可,推荐用静态缓存映射的写法,查找效率更高:
import java.util.HashMap; import java.util.Map; public enum MyValues { string1(1, "string1"), string3(3, "string3"), string4(4, "string4"); private final int code; private final String matchString; // 类加载时就初始化好code和枚举实例的映射,只执行一次 private static final Map<Integer, MyValues> CODE_TO_INSTANCE = new HashMap<>(); static { for (MyValues item : MyValues.values()) { CODE_TO_INSTANCE.put(item.code, item); } } MyValues(int code, String matchString) { this.code = code; this.matchString = matchString; } public static String getMatchString(int var) { MyValues instance = CODE_TO_INSTANCE.get(var); // 匹配不到就返回默认值,对应原来的else分支 return instance == null ? "no string found" : instance.matchString; } }
原来整段if-else逻辑,替换成一行调用就行:
finalString = MyValues.getMatchString(var);
这种写法的优势
- 维护成本低:后续新增、修改映射规则,只需要在枚举类里加对应枚举实例即可,不需要改动业务判断代码,不会出现改漏分支的问题
- 性能稳定:静态Map的查找时间复杂度是O(1),不会随着分支变多导致判断耗时增加,比长串if-else逐个判断的效率更高
- 逻辑收敛:所有值和字符串的映射关系都集中在枚举里统一管理,不会散落在项目的各个业务代码块里
如果你的枚举分支数量很少(比如就3、4个且不会频繁变动),也可以不用静态Map,直接遍历枚举值匹配,写法更简单:
import java.util.Arrays; public static String getMatchString(int var) { return Arrays.stream(MyValues.values()) .filter(item -> item.code == var) .findFirst() .map(item -> item.matchString) .orElse("no string found"); }
内容的提问来源于stack exchange,提问作者enum21
相关产品推荐
相关产品推荐

