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
相关产品推荐
相关产品推荐

