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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:45:04