如何简化Lombok Builder结合Switch语句构建对象的冗长代码
实现方案
方案1:HashMap + 函数式接口简化(优先推荐)
这是最直接无额外依赖的实现方式,完全可以替换原有冗长的switch分支,符合开闭原则,新增函数只需要新增一行映射配置即可:
- 首先定义所有函数类的公共父接口/父类,比如
BaseFunction - 静态初始化映射表,全局只加载一次:
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()) );
- 原有switch分支直接替换为一行代码,可搭配空校验处理非法参数:
// 替换原有switch代码段 function = Optional.ofNullable(FUNCTION_BUILDER_MAP.get(functionType)) .orElseThrow(() -> new IllegalArgumentException("不支持的函数类型:" + functionType)) .apply(args);
方案2:注解 + 反射实现(适合函数类型频繁新增的场景)
如果函数类型新增非常频繁,不想每次都修改映射表,可以搭配自定义注解+类扫描实现自动注册:
- 自定义函数类型注解:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface FuncType { String value(); }
- 给每个函数类加注解:
@FuncType("ABS") @Builder public class Abs implements BaseFunction { // 类原有逻辑 }
- 项目启动时扫描所有带
@FuncType注解的类,自动提取Builder逻辑注入映射表即可,后续新增函数仅需加注解,无需修改原有注册逻辑。
Lombok相关说明
Lombok目前没有原生提供字符串到Builder对象映射的专用注解,上述两种方案都可以和Lombok的@Builder注解无缝配合,不需要修改原有类的Builder实现逻辑。
内容的提问来源于stack exchange,提问作者KVM
相关产品推荐
相关产品推荐

