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

Java Record结合构建器模式的替代实现方案问询

Java Record 实现构建器模式的替代方案

针对你提到的场景——使用Java 17开发服务,想用Record做DTO但需要构建器模式,且排除Lombok、对RecordBuilder存疑的情况,以下是几种可行的方案:

1. 手写嵌套Builder类(兼容未来Immutables迁移)

这是最直接的方案,完全手动实现嵌套Builder类,同时保持与Immutables生成的Builder API一致,方便未来无缝迁移。

示例代码:

public record UserDto(String id, String name, int age) {
    // 嵌套Builder类,保持与Immutables生成的Builder方法名一致
    public static class Builder {
        private String id;
        private String name;
        private int age;

        public Builder id(String id) {
            this.id = id;
            return this;
        }

        public Builder name(String name) {
            this.name = name;
            return this;
        }

        public Builder age(int age) {
            this.age = age;
            return this;
        }

        public UserDto build() {
            // 可在此添加参数校验逻辑
            if (id == null || name.isBlank()) {
                throw new IllegalArgumentException("id和name不能为空");
            }
            return new UserDto(id, name, age);
        }
    }

    // 提供标准的builder入口方法,与Immutables生成的API对齐
    public static Builder builder() {
        return new Builder();
    }
}

调用方式:

UserDto user = UserDto.builder()
                      .id("U001")
                      .name("Alice")
                      .age(30)
                      .build();

这个方案的优势是:无额外依赖、完全可控,且未来如果Immutables支持Record的Builder生成,只需将Record替换为@Value.Immutable注解的接口/抽象类,保持builder()方法和属性设置方法名不变,业务代码无需修改即可完成迁移。

2. 链式静态工厂方法(轻量替代方案)

如果不想实现完整的Builder类,可以用Record的不可变性,通过链式的静态工厂/实例方法模拟构建器效果,适合简单DTO场景:

示例代码:

import java.math.BigDecimal;
import java.time.LocalDateTime;

public record OrderDto(String orderId, BigDecimal amount, LocalDateTime createTime) {
    // 链式修改属性,返回新的Record实例
    public OrderDto withOrderId(String orderId) {
        return new OrderDto(orderId, this.amount, this.createTime);
    }

    public OrderDto withAmount(BigDecimal amount) {
        return new OrderDto(this.orderId, amount, this.createTime);
    }

    public OrderDto withCreateTime(LocalDateTime createTime) {
        return new OrderDto(this.orderId, this.amount, createTime);
    }

    // 空实例作为构建入口
    public static OrderDto builder() {
        return new OrderDto(null, null, null);
    }
}

调用方式:

OrderDto order = OrderDto.builder()
                         .withOrderId("O20240501")
                         .withAmount(new BigDecimal("199.9"))
                         .withCreateTime(LocalDateTime.now());

3. 利用MapStruct生成Builder(间接方案)

如果你的项目已经使用MapStruct(用于对象映射的稳定库),可以借助它的代码生成能力,为Record自动生成Builder类。MapStruct支持自定义生成模板,或者通过适配配置生成符合需求的构建器,无需手动编写代码,且社区支持稳定。


关于Immutables的未来支持:目前Immutables官方尚未推出Java Record的Builder生成功能,但社区已有相关Feature Request和讨论,保持手写Builder的API与Immutables生成的风格一致,是当前最优的过渡方案。

内容的提问来源于stack exchange,提问作者y2k-shubham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:53:16