Java代码中的if语句优化(工厂模式+策略模式)

简介: 总所周知,认知复杂度是衡量方法控制流理解难度的指标, 认知复杂度高的方法将难以维护。so,这样的代码是十分难以维护的。

一、场景重现

代码中有大量的 if else if 代码:

   if (e instanceof HttpMediaTypeNotSupportedException) {
   
   
         e.printStackTrace();
      }
      else if (e instanceof MethodArgumentNotValidException) {
   
   
        e.printStackTrace();
       }
       else if (......) {
   
   
         .........
       }
       ...........

总所周知,认知复杂度是衡量方法控制流理解难度的指标, 认知复杂度高的方法将难以维护。so,这样的代码是十分难以维护的。

二、开始优化

上述代码中我们可以看到它的基本骨架是:if(e instanceof Object){//逻辑},下面我们就以它为核心进行优化。

2.1 核心接口

首先我们定义一个核心接口,这个接口定义了我们要实现的方法。

public interface MyWorks {
   
   
    boolean doWork(Exception e);
}

2.2 接口实现

我们定义几个实现类,来对核心接口进行实现,前面的代码中有几个 if 这里就定义几个实现,为了方便起见,我们这里定义了三个。

@Component
public class WorkersOne implements MyWorks {
   
   

    private static final Logger WorkersOneLog = LoggerFactory.getLogger(WorkersOne.class);

    @Override
    public boolean doWork(Exception e) {
   
   
        WorkersOneLog.info("我被执行了");
        if(e instanceof BindException){
   
   
            WorkersOneLog.info("如果是参数校验异常");
            return true;
        }
        return false;
    }
}
@Component
public class WorkersTwo implements MyWorks {
   
   
    private static final Logger WorkersTwoLog = LoggerFactory.getLogger(WorkersTwo.class);
    @Override
    public boolean doWork(Exception e) {
   
   
        WorkersTwoLog.info("我被执行了");
        if(e instanceof HttpMessageNotReadableException){
   
   
            WorkersTwoLog.info("请求参数异常");
            return true;
        }
        return false;
    }
}
@Component
public class WorkersThree implements MyWorks{
   
   
    private static final Logger WorkersThreeLog = LoggerFactory.getLogger(WorkersThree.class);
    @Override
    public boolean doWork(Exception e) {
   
   
        WorkersThreeLog.info("我被执行了");
        if(e instanceof HttpRequestMethodNotSupportedException){
   
   
            WorkersThreeLog.info("请求方式错误异常");
            return true;
        }
        return false;
    }
}

2.3 工厂实现

最后我们定义一个工厂类进行各种异常的管理和实现方法的调用

public class ExceptionFactory {
   
   

    private static final Logger ExceptionFactoryLog = LoggerFactory.getLogger(ExceptionFactory.class);
    private ExceptionFactory() {
   
   
        throw new IllegalStateException("ExceptionFactory class");
    }
    private static final List<MyWorks> list = Stream.of(
            new WorkersOne(),
            new WorkersTwo(),
            new WorkersThree()
    ).collect(Collectors.toList());

    public static void getDoWorkers(Exception e) {
   
   
        boolean status = true;
        for (MyWorks works : list){
   
   
            if(works.doWork(e)) {
   
   
                status = false;
                break;
            }
        }
        if(status){
   
   
            ExceptionFactoryLog.info("该异常未定义");
        }
    }
}

三、使用

一切都完成后,我们愉快的使用一下看看效果。

随便写一个 controller 类:

@RestController
public class ClientController {
   
   

    private static final Logger clientControllerLog = LoggerFactory.getLogger(ClientController.class);

    @PostMapping("/ex")
    public void run(@RequestBody int s){
   
   
        clientControllerLog.info("输出了 :{}",s+1);
    }
}

启动项目,使用postman或其它工具调用 127.0.0.1:8080/ex,故意输入错误参数。

使用GET传参:

17.png

使用POST传参,但参数故意错误:
07f9f5b8dbb04e988047f8b4eb8fb9fb.png

可以看到输出结果和我们使用 if 语句并无区别,但是这种的可维护性却明显提高。

目录
相关文章
|
16小时前
|
缓存 监控 Java
Java Socket编程最佳实践:优化客户端-服务器通信性能
【6月更文挑战第21天】Java Socket编程优化涉及识别性能瓶颈,如网络延迟和CPU计算。使用非阻塞I/O(NIO)和多路复用技术提升并发处理能力,减少线程上下文切换。缓存利用可减少I/O操作,异步I/O(AIO)进一步提高效率。持续监控系统性能是关键。通过实践这些策略,开发者能构建高效稳定的通信系统。
|
18小时前
|
存储 算法 安全
深入理解Java集合框架:基础类型与代码效率优化
Java集合框架是编程的核心工具,包括List、Set、Queue和Map接口及多种实现类,如ArrayList、LinkedList、HashSet、TreeSet等。理解它们的内部机制有助于优化代码。选择适合的集合类型、避免类型转换、使用并发集合和管理容量可以提升效率。深入学习这些概念能改善代码性能和可维护性。
|
18小时前
|
存储 安全 Java
Java集合框架核心组件理解这些基础类型能优化代码效率。
【6月更文挑战第21天】Java集合框架核心组件:ArrayList快速随机访问,适合大量查找;LinkedList擅于插入删除,不适于随机访问;HashMap是键值对存储,O(1)查找删除。选择取决于应用场景:频繁访问选ArrayList,频繁增删选LinkedList,键值查找选HashMap。理解这些基础类型能优化代码效率。
6 1
|
1天前
|
设计模式 Java 机器人
Java设计模式之工厂模式最详解
Java设计模式之工厂模式最详解
|
1天前
|
设计模式 Java 机器人
Java工厂模式详解
Java工厂模式详解
|
1天前
分享JavaWeb中filter过滤器的案例妙用 - 脏话过滤/编码过滤/代码过滤
分享JavaWeb中filter过滤器的案例妙用 - 脏话过滤/编码过滤/代码过滤
4 0
|
2天前
|
安全 Java 调度
Java并发编程:优化多线程应用的性能与安全性
在当今软件开发中,多线程编程已成为不可或缺的一部分,尤其在Java应用程序中更是如此。本文探讨了Java中多线程编程的关键挑战和解决方案,重点介绍了如何通过合理的并发控制和优化策略来提升应用程序的性能和安全性,以及避免常见的并发问题。
10 1
|
2天前
|
Java
【代码诗人】Java线程的生与死:一首关于生命周期的赞歌!
【6月更文挑战第19天】Java线程生命周期,如诗般描绘了从新建到死亡的旅程:创建后待命,`start()`使其就绪,获得CPU则运行,等待资源则阻塞,任务完或中断即死亡。理解生命周期,善用锁、线程池,优雅处理异常,确保程序高效稳定。线程管理,既是艺术,也是技术。
|
2天前
|
Java
【代码诗人】Java线程的生与死:一首关于生命周期的赞歌!
【6月更文挑战第19天】在Java中,线程经历新建、就绪、运行、阻塞和死亡5个阶段。通过`start()`从新建转为就绪,进而可能运行;阻塞可能因等待资源;完成任务或中断后死亡。管理线程生命周期涉及合理使用锁、线程池、异常处理和优雅关闭,如使用`volatile`和中断标志。了解这些,能提升程序效率和稳定性。
|
2天前
|
算法 搜索推荐 Java
二叉树的基本概念、常见操作以及如何使用Java代码
二叉树的基本概念、常见操作以及如何使用Java代码
8 1