Java中如何抽象复用Model类与Builder类间的重复字段声明
字段重复声明问题解决方案
针对Java Builder模式下模型类和Builder类重复声明字段导致维护成本高的问题,可根据项目场景选择以下三种方案解决:
方案1:使用Lombok @Builder注解(优先推荐,适配Katalon Studio场景)
这是工业界最常用的优化方案,完全消除字段重复维护的工作量。你只需要给模型类添加@Builder注解,Lombok会在编译期自动生成符合标准的Builder类,模型字段新增、修改时Builder会自动同步更新,无需手动维护。
代码示例:
import lombok.Builder; import lombok.Getter; // 仅需给模型类添加注解,无需手动编写Builder类代码 @Getter @Builder public class YourModel { // 所有字段仅在这里声明一次 private final long id; private final String caseName; private final int runCount; }
使用方式和原有手写Builder完全一致,无需调整现有调用代码:
YourModel testModel = YourModel.builder() .id(1001L) .caseName("登录流程测试") .runCount(3) .build();
如果需要自定义参数校验、特殊构造逻辑,只需要补充定义同名的静态Builder类,编写自定义部分的代码即可,Lombok会自动补全剩余的字段、链式方法等逻辑。
方案2:无第三方依赖的轻量改造
如果项目不允许引入Lombok,可将Builder类改为持有模型实例,避免重复声明字段:
public class YourModel { // 所有字段仅在模型类声明一次 private long id; private String caseName; private int runCount; // 构造方法私有,仅允许Builder创建实例 private YourModel() {} public static YourModelBuilder builder() { return new YourModelBuilder(); } // 仅提供Getter方法,保证实例构建后不可变 public long getId() { return id; } public String getCaseName() { return caseName; } public int getRunCount() { return runCount; } public static class YourModelBuilder { // 仅持有一个待构建的模型实例,无需重复声明字段 private final YourModel model = new YourModel(); public YourModelBuilder id(long id) { model.id = id; return this; } public YourModelBuilder caseName(String caseName) { model.caseName = caseName; return this; } public YourModelBuilder runCount(int runCount) { model.runCount = runCount; return this; } public YourModel build() { // 在这里添加参数校验逻辑 if (model.id <= 0) { throw new IllegalArgumentException("测试用例ID不能小于等于0"); } return model; } } }
该方案下新增字段仅需要补充模型字段和对应的Builder链式方法即可,不需要重复编写字段定义,维护成本降低50%以上。
方案3:JDK 16+ 配合Record实现
如果使用JDK 16及以上版本,可通过Record定义不可变模型,进一步简化代码:
// Record类字段仅声明一次,自动生成Getter、equals、hashCode等方法 public record YourModel(long id, String caseName, int runCount) { public static YourModelBuilder builder(long id) { return new YourModelBuilder(id); } public static class YourModelBuilder { private final long id; private String caseName; private int runCount; public YourModelBuilder(long id) { this.id = id; } public YourModelBuilder caseName(String caseName) { this.caseName = caseName; return this; } public YourModelBuilder runCount(int runCount) { this.runCount = runCount; return this; } public YourModel build() { // 参数校验逻辑 return new YourModel(id, caseName, runCount); } } }
内容的提问来源于stack exchange,提问作者Mike Warren
相关产品推荐
相关产品推荐

