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

