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

在Lombok @Builder重写的build()方法中如何使用默认值?

在Lombok Builder自定义build方法中访问字段默认值的解决方案

当你使用@Builder.Default标记字段并自定义build()方法时,直接引用Lombok生成的xxx$value会丢失默认值——因为Lombok的默认值逻辑是在它自动生成的build方法中通过xxx$set标记和$default$xxx()方法实现的,重写build后会覆盖这部分逻辑。以下是两种可行的解决方案:

方案一:复用Lombok生成的默认值逻辑

Lombok会为每个@Builder.Default字段生成两个内部元素:

  • xxx$set:布尔值,标记该字段是否被显式设置过
  • $default$xxx():返回字段默认值的方法

你可以在自定义build方法中利用这两个元素来获取正确的字段值:

@Builder(toBuilder = true, builderClassName = "Builder")
@Data
public class MyLombokClass {
    @lombok.Builder.Default private final String name = "Default McDefaultson";
    private final String greeting;

    public static class Builder {
        public MyLombokClass build() {
            // 确定name的最终值:未设置则用默认值
            String finalName = this.name$set ? this.name$value : MyLombokClass.$default$name();
            // 基于finalName处理greeting
            String finalGreeting = this.greeting + finalName;
            return new MyLombokClass(finalName, finalGreeting);
        }
    }
}

测试验证:

void greet(String greeting) {
    MyLombokClass lombokked = MyLombokClass.builder()
        .greeting(greeting)
        .build();

    System.out.println(lombokked.getGreeting()); // 输出:Hello Default McDefaultson
    System.out.println(lombokked.getName()); // 输出:Default McDefaultson
}

这种方式的优势是默认值只在字段声明处定义一次,避免重复维护,适合字段数量多的场景。

方案二:手动在Builder中初始化默认值

如果不想依赖Lombok的内部生成元素,可以直接在自定义Builder中初始化字段默认值,Lombok生成的setter方法会自动覆盖这些值:

@Builder(toBuilder = true, builderClassName = "Builder")
@Data
public class MyLombokClass {
    private final String name;
    private final String greeting;

    public static class Builder {
        // 手动初始化默认值
        private String name = "Default McDefaultson";
        private String greeting;

        // Lombok会自动生成name()、greeting()等setter方法
        public MyLombokClass build() {
            return new MyLombokClass(name, greeting + name);
        }
    }

    // 必须显式声明构造器,供Builder调用
    private MyLombokClass(String name, String greeting) {
        this.name = name;
        this.greeting = greeting;
    }
}

这种方式更贴近手动实现Builder的逻辑,代码可读性更高,不需要了解Lombok的内部细节,但需要在Builder中逐个初始化带默认值的字段。

问题根源说明

你之前的代码中,未设置name时name$value为null,因为Lombok原本的build逻辑会在name$set为false时调用$default$name()填充值,但你重写build方法后跳过了这个逻辑,导致默认值未生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 07:43:16