探讨if…else的替代方案

大家在开发过程中,经常会用到if...else语句,尤其针对那些业务分支较多的情况下,if...else显得非常臃肿,大大影响代码的可读性,并且增加了维护的成本,一些大公司代码规范比较严格,单个类或者单个方法也有圈复杂度的最大限制。那么,针对以上问题,来和大家探讨下if...else的替代方案。假设我们现在要做一个计算器,实现加减乘除的功能:

令人头疼的if...else

public static int calculate(String operator, int a, int b) {
    if ("add".equals(operator)) {
        return a + b;
    } else if ("subtract".equals(operator)) {
        return a - b;
    } else if ("multiply".equals(operator)) {
        return a * b;
    } else if ("divide".equals(operator)) {
        return a / b;
    }
    return 0;
}

还不错的switch...case

public static int calculate(String operator, int a, int b) {
    switch (operator) {
        case "add":
            return a + b;
        case "subtract":
            return a - b;
        case "multiply":
            return a * b;
        case "divide":
            return a / b;
        default:
            return 0;
    }
}

使用枚举类

public static int calculate(String operator, int a, int b) {
    return Calculator.calculate(operator, a, b);
}

public enum Calculator {

    ADD {
        @Override
        public int apply(int a, int b) {
            return a + b;
        }
    },
    SUBTRACT {
        @Override
        public int apply(int a, int b) {
            return a - b;
        }
    };

    abstract int apply(int a, int b);

    public static int calculate(String operatorName, int a, int b) {
        for (Calculator calculator : Calculator.values()) {
            if (calculator.toString().equalsIgnoreCase(operatorName)) {
                return calculator.apply(a, b);
            }
        }
        return 0;
    }
}

工厂模式

public interface Operation {
    int apply(int a, int b);
}

public class Add implements Operation {
    @Override
    public int apply(int a, int b) {
        return a + b;
    }
}

public class Subtract implements Operation {
    @Override
    public int apply(int a, int b) {
        return a - b;
    }
}

public class Calculator {
    private static Map<String, Operation> calcutorMap = new HashMap<>();
    
    static {
        calcutorMap.put("add", new Add());
        calcutorMap.put("subtract", new Subtract());
    }

    public static int calculate(String operator, int a, int b) {
        return calcutorMap.get(operator).apply(a, b);
    }
}

jdk8的功能性接口(这里卖个关子,理解了下面的代码后,可自己动手哦^_^)

@FunctionalInterface
public interface VoidFunction {

    void apply();

}
public class IfElse {

    private Map<Boolean, VoidFunction> logicAndFunctionMaps = new LinkedHashMap<>();

    public static IfElse create() {
        return new IfElse();
    }

    public IfElse ifLogic(boolean condition, VoidFunction ifFunction) {
        return addLogic(condition, ifFunction);
    }

    public IfElse elseIfLogic(boolean condition, VoidFunction ifFunction) {
        return addLogic(condition, ifFunction);
    }

    public IfElse elseLogic(VoidFunction ifFunction) {
        return addLogic(true, ifFunction);
    }

    private IfElse addLogic(boolean condition, VoidFunction ifFunction) {
        this.logicAndFunctionMaps.put(condition, ifFunction);
        return this;
    }

    public boolean execute() {
        for (Map.Entry<Boolean, VoidFunction> entry : logicAndFunctionMaps.entrySet()) {
            if (entry.getKey()) {
                entry.getValue().apply();
                return true;
            }
        }
        return false;
    }

}
public static void calculate(String payType) {
    IfElse.create()
            .ifLogic("alipay".equals(payType), () -> System.out.println("支付宝支付"))
            .elseIfLogic("wechat".equals(payType), () -> System.out.println("微信支付"))
            .elseLogic(() -> System.out.println("无效的支付方式"))
            .execute();
}

综上所述,替代if...else的方案有很多种(包括策略模式、命令模式等等,偷个懒,这里就不一一列举了),有的是轻量级,有的则稍显笨重些,根据不同的业务场景选择合适的方案。

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值