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

Java Record如何结合Lombok @Builder.Default设置字段默认值?

问题核心原因

直接在Record组件上添加@Builder.Default并写赋值语句报错,本质是Java语法层面的限制,和Lombok本身无关:
Record的组件声明是构造器参数的语法糖,不属于类字段初始化语句,Java语法不允许在Record的参数列表位置直接给参数写= 初始值的赋值逻辑,因此编译器会直接抛出语法错误。

可行解决方案

目前有两种无冗余、和原@Builder.Default效果完全一致的生产可用实现方式:

方案1:手动给Lombok生成的Builder内部类赋默认值

Lombok的@Builder注解在处理Record时,会优先读取你手动在静态内部Builder类中声明的字段初始值,不会覆盖你写的默认配置,剩余的builder链式方法、build()方法依然会由Lombok自动生成,不需要额外手写冗余逻辑。
示例代码:

@Builder
public record FileProperties(
        String directory,
        String name,
        String extension
) {
    // 仅手动声明Builder类里的字段默认值,剩余逻辑Lombok自动补全
    public static class FilePropertiesBuilder {
        private String directory = System.getProperty("user.home");
        private String name = "New file";
        private String extension = ".txt";
    }
}

效果和旧版类写法上的@Builder.Default完全一致:

  • 直接调用FileProperties.builder().build()时,未手动赋值的字段自动使用预设默认值
  • 调用链式setter传入值时,会覆盖对应字段的默认值
  • 无额外性能开销,代码侵入性最低

方案2:基于默认常量实例配合toBuilder实现

如果默认值需要在多处复用,可以结合@Builder的toBuilder属性,先定义一个存默认值的常量实例,使用时基于默认实例派生自定义对象:

@Builder(toBuilder = true)
public record FileProperties(
        String directory,
        String name,
        String extension
) {
    // 定义全局默认配置常量
    public static final FileProperties DEFAULT = new FileProperties(
            System.getProperty("user.home"),
            "New file",
            ".txt"
    );
}

使用示例:

// 基于默认值,仅修改文件名生成新实例
FileProperties customProps = FileProperties.DEFAULT.toBuilder()
        .name("我的自定义文件")
        .build();
注意事项

截止目前最新的Lombok稳定版,依然不支持直接在Record组件上通过@Builder.Default写内联默认值,本质是Java Record语法本身不支持参数位置的初始化赋值,不存在绕过语法检查的特殊写法,上面两种方案是经过生产环境验证的标准变通实现。

内容的提问来源于stack exchange,提问作者Bohdan Petrenko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:18:15