Java 代码中 if/switch 重构方案的几种实现

 更新时间:2026年01月25日 10:56:26   作者:一线大码  
在Java开发中,想要避免出现大量 if...else 或 switch...case,可以使用多种设计模式和技巧来“消除条件分支”,下面总结几种常用、实战有效的方案

在 Java 开发中,想要避免出现大量 if...else 或 switch...case,可以使用多种设计模式和技巧来“消除条件分支”。下面总结几种常用、实战有效的方案。

1. 使用枚举 + Lambda

适合一些轻量级逻辑分派。

package com.example.demo.enums;

import lombok.AllArgsConstructor;

import java.util.function.BiFunction;

@AllArgsConstructor
public enum OperationEnum {
    ADD((a, b) -> a + b),
    SUB((a, b) -> a - b),
    MUL((a, b) -> a * b),
    DIV((a, b) -> a / b);

    private final BiFunction<Integer, Integer, Integer> function;

    public int apply(int a, int b) {
        return function.apply(a, b);
    }
}

使用代码,方法参数传递过来一个枚举,直接调用 apply 方法就行:

public static void main(String[] args) {
    int result = operation(OperationEnum.MUL, 2, 3);
    System.out.println(result);
}

//这个方法减少了ifelse判断
private static int operation(OperationEnum operationEnum, int a, int b) {
    return operationEnum.apply(a, b);
}

2. 使用枚举 + Lambda + Map

适合简单分派逻辑。

package com.example.demo.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum ActionEnum {

    ACTION_A("A"),
    ACTION_B("B");

    private final String action;
}
package com.example.demo.handler;

import com.example.demo.enums.ActionEnum;

import java.util.HashMap;
import java.util.Map;

public class ActionHandler {
    private static final Map<String, Runnable> ACTION = new HashMap<>();

    static {
        ACTION.put(ActionEnum.ACTION_A.getAction(), () -> System.out.println("执行逻辑 A"));
        ACTION.put(ActionEnum.ACTION_B.getAction(), () -> System.out.println("执行逻辑 B"));
    }

    public static void execute(ActionEnum actionEnum) {
        ACTION.getOrDefault(actionEnum.getAction(), () -> System.out.println("默认逻辑")).run();
    }
}

使用代码:

ActionHandler.execute(ActionEnum.ACTION_A);

3. 使用责任链模式

适合逐步判断、条件过滤的业务,比如审批、数据校验。可自由扩展处理链,避免多层 if 嵌套。

首先提供一个抽象类,Request是个辅助类,可根据真实业务修改:

package com.example.demo.handler;

import lombok.Data;

@Data
public class Request {
    private boolean authenticated;
    private boolean validate;
}
package com.example.demo.handler;

import lombok.Setter;

public abstract class Handler {
    @Setter
    protected Handler next;

    public abstract void handle(Request request);
}

三个继承抽象类的子类:

package com.example.demo.handler;

public class AuthHandler extends Handler {
    @Override
    public void handle(Request request) {
        if (request.isAuthenticated()) {
            System.out.println("login success");
            if (next != null) {
                next.handle(request);
            }
        } else {
            System.out.println("login fail");
        }
    }
}
package com.example.demo.handler;

public class ValidationHandler extends Handler{
    @Override
    public void handle(Request request) {
        if (request.isValidate()){
            System.out.println("validation success");
            if (next != null) {
                next.handle(request);
            }
        }else {
            System.out.println("validation failed");
        }
    }
}
package com.example.demo.handler;

public class BusinessHandler extends Handler {
    @Override
    public void handle(Request request) {
        System.out.println("start handler business");
    }
}

使用代码:

Request request = new Request();
request.setAuthenticated(true);
request.setValidate(true);
AuthHandler authHandler = new AuthHandler();
ValidationHandler validationHandler = new ValidationHandler();
BusinessHandler businessHandler = new BusinessHandler();
//设置处理顺序
authHandler.setNext(validationHandler);
validationHandler.setNext(businessHandler);
//开始触发执行
authHandler.handle(request);

执行结果:

login success
validation success
start handler business

4. 使用策略模式

参考我的另一篇博文:SpringBoot 优雅实现接口的多实现类方式

到此这篇关于Java 代码中 if/switch 重构方案的几种实现的文章就介绍到这了,更多相关Java if/switch 重构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring多定时任务@Scheduled执行阻塞问题解决

    Spring多定时任务@Scheduled执行阻塞问题解决

    这篇文章主要介绍了Spring多定时任务@Scheduled执行阻塞问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 使用 Spring Boot 内嵌容器 Undertow创建服务器的方法

    使用 Spring Boot 内嵌容器 Undertow创建服务器的方法

    Undertow是一个非常轻量并高性能的web server,它来自 JBoss。支持blocking和non-blocking两种NIO API。接下来通过本文给大家介绍使用Spring Boot 内嵌容器 Undertow创建服务器的方法,感兴趣的朋友一起看看吧
    2017-11-11
  • 深入了解Java中的反射机制(reflect)

    深入了解Java中的反射机制(reflect)

    Java的反射机制允许我们对一个类的加载、实例化、调用方法、操作属性的时期改为在运行期进行,这大大提高了代码的灵活度,本文就来简单讲讲反射机制的具体使用方法吧
    2023-05-05
  • spring-session自定义序列化方式

    spring-session自定义序列化方式

    这篇文章主要介绍了spring-session自定义序列化方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 将项目上传到Maven中央仓库(2023最新版)

    将项目上传到Maven中央仓库(2023最新版)

    本文主要介绍了将项目上传到Maven中央仓库(2023最新版),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • SpringBoot中Druid连接池与多数据源切换的方法

    SpringBoot中Druid连接池与多数据源切换的方法

    微服务架构中多数据源切换是个常见的需求,Spring Boot 提供了强大的支持来简化这一过程.本文给大家介绍了SpringBoot中Druid连接池与多数据源切换的方法,需要的朋友可以参考下
    2024-11-11
  • java使用nio2拷贝文件的示例

    java使用nio2拷贝文件的示例

    这篇文章主要介绍了java使用nio2拷贝文件的示例,需要的朋友可以参考下
    2014-04-04
  • 浅谈Java当作数组的几个应用场景

    浅谈Java当作数组的几个应用场景

    数组可以存放多个同一类型的数据,可以存储基本数据类型,引用数据类型(对象),下面这篇文章主要给大家介绍了关于Java当作数组的几个应用场景,需要的朋友可以参考下
    2022-11-11
  • 浅谈Mybatis+mysql 存储Date类型的坑

    浅谈Mybatis+mysql 存储Date类型的坑

    这篇文章主要介绍了浅谈Mybatis+mysql 存储Date类型的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • java实现阿拉伯数字转汉字数字

    java实现阿拉伯数字转汉字数字

    这篇文章主要为大家详细介绍了java实现阿拉伯数字转换为汉字数字源代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04

最新评论