You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化Lombok Builder结合Switch语句构建对象的冗长代码

实现方案

方案1:HashMap + 函数式接口简化(优先推荐)

这是最直接无额外依赖的实现方式,完全可以替换原有冗长的switch分支,符合开闭原则,新增函数只需要新增一行映射配置即可:

  1. 首先定义所有函数类的公共父接口/父类,比如BaseFunction
  2. 静态初始化映射表,全局只加载一次:
import java.util.function.Function;
import java.util.Map;
import java.util.Optional;

// 所有函数类实现的公共接口
public interface BaseFunction {}

// 全局映射表,静态初始化一次即可
private static final Map<String, Function<List<Object>, BaseFunction>> FUNCTION_BUILDER_MAP = Map.ofEntries(
    Map.entry("ABS", args -> Abs.builder().argument(args).build()),
    Map.entry("SUM", args -> Sum.builder().argument(args).build()),
    Map.entry("IF", args -> IfThen.builder().argument(args).build()),
    Map.entry("IFNA", args -> IfNa.builder().argument(args).build())
);
  1. 原有switch分支直接替换为一行代码,可搭配空校验处理非法参数:
// 替换原有switch代码段
function = Optional.ofNullable(FUNCTION_BUILDER_MAP.get(functionType))
        .orElseThrow(() -> new IllegalArgumentException("不支持的函数类型:" + functionType))
        .apply(args);

方案2:注解 + 反射实现(适合函数类型频繁新增的场景)

如果函数类型新增非常频繁,不想每次都修改映射表,可以搭配自定义注解+类扫描实现自动注册:

  1. 自定义函数类型注解:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface FuncType {
    String value();
}
  1. 给每个函数类加注解:
@FuncType("ABS")
@Builder
public class Abs implements BaseFunction {
    // 类原有逻辑
}
  1. 项目启动时扫描所有带@FuncType注解的类,自动提取Builder逻辑注入映射表即可,后续新增函数仅需加注解,无需修改原有注册逻辑。

Lombok相关说明

Lombok目前没有原生提供字符串到Builder对象映射的专用注解,上述两种方案都可以和Lombok的@Builder注解无缝配合,不需要修改原有类的Builder实现逻辑。

内容的提问来源于stack exchange,提问作者KVM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:21:03