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 语句并无区别,但是这种的可维护性却明显提高。

目录
相关文章
|
24天前
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
30 0
|
3天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
15 6
|
3天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
19 3
|
11天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
49 2
|
24天前
|
存储 监控 小程序
Java中的线程池优化实践####
本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####
|
16天前
|
存储 Java
Java 11 的String是如何优化存储的?
本文介绍了Java中字符串存储优化的原理和实现。通过判断字符串是否全为拉丁字符,使用`byte`代替`char`存储,以节省空间。具体实现涉及`compress`和`toBytes`方法,前者用于尝试压缩字符串,后者则按常规方式存储。代码示例展示了如何根据配置决定使用哪种存储方式。
|
25天前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
65 5
|
25天前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
49 5
|
23天前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
26天前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
38 4