"if else" 堆成山?这招让你的代码优雅起飞!

原创 首发于卫星

"如果你的代码里 if else 多到能织毛衣,是时候考虑优化了!"

想必大家对if else 的使用都不陌生,原本清晰的逻辑渐渐被层层嵌套的 if else 淹没,最终变成啦一座"判断地狱",代码就像屎山,越堆越多,像定时炸弹一样潜伏着,处处都是未知的 Bug

需求

通过MQ接收不同类型的数据,将不同的数据存储在不同的表中,文件处理有顺序

数据类型和对应的表关系:

  • YA_DETAILS.DT (表:ya_details)
  • ALARM_DETAILS.DT (表:alarm_details)
  • COVER_DETAILS.DT (表:cover_details)

原方式

使用简单的 if else 实现

java 复制代码
@Component
public class DtFileConsumer {
    
    @RabbitListener(queues = "dt")
    public void receiveMessage(String message) {
        JSONObject jsonObject = new JSONObject(message);
        String fileName = jsonObject.getStr("fileName");
        if(fileName.startsWith("YA_DETAILS")){
                // 处理 YA_DETAILS
        } else if (fileName.startsWith("ALARM_DETAILS")){
                // 处理 ALARM_DETAILS
        } else if (fileName.startsWith("COVER_DETAILS")){
                // 处理 COVER_DETAILS 文件
        }
    }
}

现方式

java 复制代码
@Component
@RequiredArgsConstructor
public class DtFileConsumer {

    private final BaseConditionalDispatcher baseDispatcher;
    
    @RabbitListener(queues = "dt")
    public void receiveMessage(String message) {
        JSONObject jsonObject = new JSONObject(message);
        String fileName = jsonObject.getStr("fileName");
        baseDispatcher.dispatch(fileName);
    }
}

定义分发器

java 复制代码
/**
 * @description: 通用条件类型分发器,通常用于优化条件选择分支的分发
 * @author: Walker
 * @date: 2025-04-11 14:45:34
 * @version: 1.0.0
 * @see top.walker.core.handler.BaseConditionalHandler
 */
@Component
public class BaseConditionalDispatcher {

    private static final Logger logger = LoggerFactory.getLogger(BaseConditionalDispatcher.class);

    private final List<BaseConditionalHandler<?>> handlers;

    public BaseConditionalDispatcher(List<BaseConditionalHandler<?>> handlers) {
        // 优先级排序
        this.handlers = handlers.stream()
                .sorted(Comparator.comparingInt(BaseConditionalHandler::getOrder))
                .collect(Collectors.toList());
    }

    /**
     * 分发处理请求
     *
     * @param processed 待处理的
     */
    public void dispatch(Object processed) {
        BaseConditionalHandler<?> handler = handlers.stream().filter(h -> h.supports(processed)).findFirst()
                .orElseGet(() -> {
                    logger.info("已跳过:{}", processed);
                    return null;
                });
        if (handler != null) {
            this.invokeHandler(handler, processed);
        }
    }

    @SuppressWarnings("unchecked")
    private <T> void invokeHandler(BaseConditionalHandler<T> handler, Object processed) {
        handler.handle((T) processed);
    }

}

定义处理器

java 复制代码
/**
 * @description: 通用类型处理器接口
 * @author: Walker
 * @date: 2025-04-11 14:31:37
 * @version: 1.0.0
 */
public interface BaseConditionalHandler<T> {

    /**
     * 是否支持该数据(支持对象、字符串、数字等多种形式)
     *
     * @param object 数据
     * @return 是否支持
     */
    boolean supports(Object object);

    /**
     * 处理数据的具体实现
     *
     * @param processed 待处理的内容
     */
    void handle(T processed);

    /**
     * 处理优先级(数值越小优先级越高)
     *
     * @return 优先级
     */
    default int getOrder() {
        return 0;
    }

}

匹配和处理逻辑

需要进行文件处理的 Service 都需要实现 BaseConditionalHandler 接口

YA_DETAILS 处理

java 复制代码
@Component
public class YaDetailsServiceImpl implements BaseConditionalHandler<String> {

    private static final List<String> SUPPORTED_EXTENSIONS = List.of("YA_DETAILS");

    @Override
    public boolean supports(Object object) {
        return SUPPORTED_EXTENSIONS.stream().anyMatch(s -> ((String) object).startsWith(s));
    }

    @Override
    public void handle(String processed) {
        System.out.println("fileName= " + processed);
    }

}

ALARM_DETAILS 处理

java 复制代码
@Component
public class AlarmDetailsServiceImpl implements BaseConditionalHandler<String> {

    private static final List<String> SUPPORTED_EXTENSIONS = List.of("ALARM_DETAILS");

    @Override
    public boolean supports(Object object) {
        return SUPPORTED_EXTENSIONS.stream().anyMatch(s -> ((String) object).startsWith(s));
    }

    @Override
    public void handle(String processed) {
        System.out.println("fileName= " + processed);
    }

}

到此实现了我们需求,后续扩展只需要继承 BaseConditionalHandler 即可

结束!

相关推荐
我爱加班、、3 分钟前
Websocket能携带token过去后端吗
前端·后端·websocket
撩得Android一次心动14 分钟前
Android LiveData 全面解析:使用Java构建响应式UI【源码篇】
android·java·android jetpack·livedata
组合缺一18 分钟前
Solon AI (Java) v3.9 正式发布:全能 Skill 爆发,Agent 协作更专业!仍然支持 java8!
java·人工智能·ai·llm·agent·solon·mcp
MSTcheng.23 分钟前
【C++】C++11新特性(二)
java·开发语言·c++·c++11
一 乐26 分钟前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
KIKIiiiiiiii27 分钟前
微信个人号API二次开发中的解决经验
java·人工智能·python·微信
80530单词突击赢28 分钟前
SpringBoot整合SpringMVC全解析
java·spring boot·后端
vx1_Biye_Design38 分钟前
基于Spring Boot+Vue的学生管理系统设计与实现-计算机毕业设计源码46223
java·vue.js·spring boot·spring·eclipse·tomcat·maven
vx_Biye_Design39 分钟前
基于Spring Boot+vue的湖北旅游景点门票预约平台的设计--毕设附源码29593
java·vue.js·spring boot·spring cloud·servlet·eclipse·课程设计
hdsoft_huge44 分钟前
1panel面板中部署SpringBoot和Vue前后端分离系统 【图文教程】
vue.js·spring boot·后端