JAVA实战-if-else优化

目录

  • 前言
    • 优化方法1-函数提取
    • 优化方法2-采用多态+工厂
    • 优化方法3-利用反射
  • 总结

前言

在java开发中,往往避免不了通过判断多种状态,做不同的业务处理。如果if-else嵌套层太多,则会造成代码的可读性降低以及后期的维护难度升高。

        if (event.getEventType() == 1){
            //do something
        }else if (event.getEventType() == 2){
            //do something
        }else if (event.getEventType() == 3){
            //do something
        }else {
            //do something
        }

可以看到上述代码,if-else里面又嵌套了一层if-else,每个分支都会有不同的业务逻辑处理,这样的好处就是编写代码的时候实现较为简单,方便,但等到后续遇到需求更改或者需要维护的时候,会发现难以维护。下面,我们直接进入优化方法的讲解:

优化方法1-函数提取

这个是比较基本的方法,适用于每个分支处理都比较复杂的方法,将业务逻辑单独提取出去可以让分支易读性增加,但是整体的易读性还是很低。

public static void handlerA(){
        //do something
    }

service层代码可以改写为

        if (event.getEventType() == 1){
            handlerA();
        }else if (event.getEventType() == 2){
            handlerB();
        }else if (event.getEventType() == 3){
            handlerC();
        }else {
            handlerOther();
        }

这种方法可以将繁杂的业务代码和判断分支剥离,但并不能优化到service层的if-else分支。

优化方法2-采用多态+工厂

多态方法,就是定义一个父类Executor,抽取共同属性和方法,然后让各个分支作为子类去重写业务逻辑处理代码。
父类:

public abstract class HandlerExecutor {

    // 子类可重写该方法
    public void process(Event event) {
    }
}

子类:

public class HandlerAExecutor extends HandlerExecutor{

    @Override
    public void process(Event event) {
    }

}

利用工场模式定义一个工厂类来生成不用的子类Executor处理判断分支:

 public static TestFlowInfoExecutor executor(Event event) {
        HandlerExecutor handlerExecutor = null;
        if (event.getEventType() == 1){
            handlerExecutor = new HandlerAExecutor();
        }else if (event.getEventType() == 2){
            handlerExecutor = new HandlerBExecutor();
        }else if (event.getEventType() == 3){
            handlerExecutor = new HandlerCExecutor();
        }else {
            handlerExecutor = new HandlerOtherExecutor();
        }
        return null;
    }

最后,service层处理方式:

TestFlowInfoExecutor testFlowInfoExecutor = null;
testFlowInfoExecutor .process(event);

多态+工场方式,可以很好降低各个分支的业务处理逻辑代码和service层的耦合,如果有需求改动,则新增一个子类即可解决,在一定程度增加了可维护性。

优化方法3-利用反射

先定义一个handle类,将业务逻辑代码抽取到此类。

public class TestHandler {

    private boolean isHandled = false;
    
    public void handleA(Event event){
        if (event.getEventType() ==1){
            //do something
        }
    }

    public void handleB(Event event){
    //do something
    }

    public void handleC(Event event){
    //do something
    }

    public void handleD(Event event){
    //do something
    }

    public void handleOthers(Event event){
    //do something
    }

    private void setSuccess(){
        this.isHandled = true;
    }

    public void resetHandleState(){
        this.isHandled = false;
    }

    public boolean isHandled() {
        return isHandled;
    }

}

service层处理方式:

            TestHandler testHandler = new TestHandler();
            //获取到TestHandler的方法
            Method[] methods = TestHandler.class.getMethods();
            for (Method method : methods){
                //找到handle的方法
                if (method.getName().startsWith("handle")){
                    try {
                        //调用invoke方法找到对应的逻辑处理代码
                        method.invoke(testHandler , event);
                    } catch (IllegalAccessException | InvocationTargetException e) {
                        e.printStackTrace();
                    }
                }
                if (baiduDocHandler.isHandled()){
                    //处理完毕
                    baiduDocHandler.resetHandleState();
                    break;
                }
            }

通过反射的方法,可以更好地降低代码的耦合性,也方便后续的维护,也是一个不错的选择之一。

总结

本文是主要介绍了三种方法去进行大量if-else的操作,我更喜欢的是使用反射的方法,这种方法不仅可以帮助你了解更多关于反射的底层,代码量上比多态的也更为简便。

你可能感兴趣的:(JAVA实战)