本文我总结10 种优化 if else 的方法,当然根据不同的场景还可以使用多态、责任链模式、模板方法模式等更多方法来消除 if else。
方案1:策略模式
- 如果有 1 万个 if else 分支,那就会有 1 万个策略类,此时就会造成类膨胀,并且随着时间的推移逐渐变得更加庞大而复杂。
- 如果是多层的 if else 嵌套,策略模式可能也无法派上用场了。
方案2:策略模式变体
Map<Integer, Runnable> actionMap = new HashMap<>();
actionMap.put("condition1", () -> { /* 分支1的执行逻辑 */ });
actionMap.put("condition2", () -> { /* 分支2的执行逻辑 */ });
actionMap.put("conditionN", () -> { /* 分支N的执行逻辑 */ });
// 根据条件获取执行逻辑
Runnable action = actionMap.get("condition1");
if (action != null) {
action.run();
}
这种把业务逻辑代码分离出去了,简化了单个类的代码,也省去了策略实现类,可是如果有大量的条件映射,依然会造成单个类的膨胀和难以维护。
方案3:多级嵌套优化
上面说的两种方案嵌套可能无法解决,如果是这种带层级的判断是可以优化的,这个你觉得怎么优化?
if(xxxOrder != null){
if(xxxOrder.getXxxShippingInfo() != null){
if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails() != null){
if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails().getXxxTrackingInfo() != null){
...
}
}
}
}
方案4:使用三目运算符
如果判断条件不多,只有 2、3 个的情况下可以使用三目运算符简化 if else 分支。
String desc;
if (condition1) {
desc = "XX1";
} else if (condition2) {
desc = "XX2";
} else {
desc = "XX3";
}
使用三目运算符一行搞定:
String desc = condition1 ? "XX1" : (condition2 ? "XX2" : "XX3");
超过 3 个条件就不建议使用了。
方案5:使用枚举
枚举类型可以用来表示一组固定的值,例如星期几、月份、颜色等,它提供了一种更简洁、可读性更高的方式来表示一组相关的常量。
public class Test {
public static void main(String[] args) {
Day today = Day.MONDAY;
System.out.println("Today is " + today);
System.out.println("Today is " + today.getChineseName());
}
enum Day {
MONDAY("星期一"),
TUESDAY("星期二"),
WEDNESDAY("星期三"),
THURSDAY("星期四"),
FRIDAY("星期五"),
SATURDAY("星期六"),
SUNDAY("星期日");
private String chineseName;
Day(String chineseName) {
this.chineseName = chineseName;
}
public String getChineseName() {
return chineseName;
}
}
}
这里我只写了一个字段,我们可以在枚举属性里面定义多个字段,这样就无需大量的 if else 判断,直接通过枚举来获取某个某一组固定的值了。
方案6:使用 Optional
Java 8 提供了一个 Optional 新特性,它是一个可以包含 null 值的容器对象,可以用来代替 xx != null 的判断。
方案7:尽快返回
分析业务,根据 if else 的执行次数按降序排,把执行次数较多的 if 放在最前面,如果符合条件,就使用 return 返回,如下面代码:
if (条件1) {
return
}
if (条件2) {
return
}
...
这样改可能是比较简单的方式,在很大程度上可以提升系统的性能,但是还存在以下问题:
- 有的条件不能按执行次数排序,存在先后或者互斥关系。
- 如果新增一个条件,可能无法马上判定它的执行次数,如果放在后面可能也还会影响性能。
- 对类的继续膨胀和代码维护没有任何帮助。
方案8:去除没必要的 if else
if (condition) {
...
} else {
return;
}
优化后:
if(!condition){
return;
}
或者是这样:
return !condition
方案9:合并条件
考虑是不是可以合并归类,比如是不是可以把几百、几千个相似逻辑的归为一类,这样也能大大简化 if else 数量。
比如以下代码:
double calculateShipping() {
if (orderAmount > 1000) {
return 0.5;
}
if (customerLoyaltyLevel > 5) {
return 0.5;
}
if (promotionIsActive) {
return 0.5;
}
}
优化后:
double calculateShipping() {
if (orderAmount > 1000 || customerLoyaltyLevel > 5 || promotionIsActive) {
return 0.5;
}
}
这样就把返回相同值的 if 归为一类了,如果 if 较大就能大大简化代码量。
方案10:规则引擎
对于复杂的业务逻辑,业务规则经常变化,规则制定不依赖于技术团队,需要实现可配置的逻辑处理,此时可以考虑使用规则引擎来处理,比如 Drools。
总之,消除 if else 并没有万能的方法,也不可能全部优化掉,在实际开发中需要根据实际场景使用不同的方法,以及多种方法组合使用,这样才是正确的方式。
最后说一句(求关注!别白嫖!)
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。
关注公众号:woniuxgg,在公众号中回复:笔记 就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!