当前位置:   article > 正文

探讨if…else的替代方案

探讨if…else的替代方案

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

令人头疼的if...else

  1. public static int calculate(String operator, int a, int b) {
  2. if ("add".equals(operator)) {
  3. return a + b;
  4. } else if ("subtract".equals(operator)) {
  5. return a - b;
  6. } else if ("multiply".equals(operator)) {
  7. return a * b;
  8. } else if ("divide".equals(operator)) {
  9. return a / b;
  10. }
  11. return 0;
  12. }

还不错的switch...case

  1. public static int calculate(String operator, int a, int b) {
  2. switch (operator) {
  3. case "add":
  4. return a + b;
  5. case "subtract":
  6. return a - b;
  7. case "multiply":
  8. return a * b;
  9. case "divide":
  10. return a / b;
  11. default:
  12. return 0;
  13. }
  14. }

使用枚举类

  1. public static int calculate(String operator, int a, int b) {
  2. return Calculator.calculate(operator, a, b);
  3. }
  4. public enum Calculator {
  5. ADD {
  6. @Override
  7. public int apply(int a, int b) {
  8. return a + b;
  9. }
  10. },
  11. SUBTRACT {
  12. @Override
  13. public int apply(int a, int b) {
  14. return a - b;
  15. }
  16. };
  17. abstract int apply(int a, int b);
  18. public static int calculate(String operatorName, int a, int b) {
  19. for (Calculator calculator : Calculator.values()) {
  20. if (calculator.toString().equalsIgnoreCase(operatorName)) {
  21. return calculator.apply(a, b);
  22. }
  23. }
  24. return 0;
  25. }
  26. }

工厂模式

  1. public interface Operation {
  2. int apply(int a, int b);
  3. }
  4. public class Add implements Operation {
  5. @Override
  6. public int apply(int a, int b) {
  7. return a + b;
  8. }
  9. }
  10. public class Subtract implements Operation {
  11. @Override
  12. public int apply(int a, int b) {
  13. return a - b;
  14. }
  15. }
  16. public class Calculator {
  17. private static Map<String, Operation> calcutorMap = new HashMap<>();
  18. static {
  19. calcutorMap.put("add", new Add());
  20. calcutorMap.put("subtract", new Subtract());
  21. }
  22. public static int calculate(String operator, int a, int b) {
  23. return calcutorMap.get(operator).apply(a, b);
  24. }
  25. }

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

  1. @FunctionalInterface
  2. public interface VoidFunction {
  3. void apply();
  4. }
  1. public class IfElse {
  2. private Map<Boolean, VoidFunction> logicAndFunctionMaps = new LinkedHashMap<>();
  3. public static IfElse create() {
  4. return new IfElse();
  5. }
  6. public IfElse ifLogic(boolean condition, VoidFunction ifFunction) {
  7. return addLogic(condition, ifFunction);
  8. }
  9. public IfElse elseIfLogic(boolean condition, VoidFunction ifFunction) {
  10. return addLogic(condition, ifFunction);
  11. }
  12. public IfElse elseLogic(VoidFunction ifFunction) {
  13. return addLogic(true, ifFunction);
  14. }
  15. private IfElse addLogic(boolean condition, VoidFunction ifFunction) {
  16. this.logicAndFunctionMaps.put(condition, ifFunction);
  17. return this;
  18. }
  19. public boolean execute() {
  20. for (Map.Entry<Boolean, VoidFunction> entry : logicAndFunctionMaps.entrySet()) {
  21. if (entry.getKey()) {
  22. entry.getValue().apply();
  23. return true;
  24. }
  25. }
  26. return false;
  27. }
  28. }
  1. public static void calculate(String payType) {
  2. IfElse.create()
  3. .ifLogic("alipay".equals(payType), () -> System.out.println("支付宝支付"))
  4. .elseIfLogic("wechat".equals(payType), () -> System.out.println("微信支付"))
  5. .elseLogic(() -> System.out.println("无效的支付方式"))
  6. .execute();
  7. }

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/377839
推荐阅读
相关标签
  

闽ICP备14008679号