Lombok @Builder.Default导致Optional默认值被置空问题咨询
我之前也踩过这个Lombok的小坑!咱们一步步来捋清楚问题和解决办法:
问题根源
首先,你看到的warning: @Builder will ignore the initializing expression entirely是因为Lombok的@Builder注解默认会完全忽略字段的初始化表达式——也就是说你写的private Optional<Test> test = Optional.empty();在Builder模式下根本不会生效,这就是警告的原因。
而当你加上@Builder.Default后,之所以感觉“被强制置空”,大概率是对Lombok生成的Builder逻辑有点误解:@Builder.Default的作用是让Builder在没有显式设置该字段时,使用你定义的默认值(也就是Optional.empty()),而不是强制把它变成null。如果你的代码里出现了null,可能是Lombok版本兼容性问题,或者编译缓存导致的异常。
正确的解决方案
把@Builder.Default直接标注在字段上,保留Optional.empty()的初始化表达式,同时建议使用Lombok 1.18.10及以上版本(这个版本修复了不少@Builder.Default和Optional配合的小问题)。修正后的代码如下:
public enum Test { VALUE1, VALUE2 } @Builder @AllArgsConstructor @NoArgsConstructor @Getter public class MyClass { @JsonProperty(name = "test") @Builder.Default private Optional<Test> test = Optional.empty(); }
验证逻辑
这样修改后:
- 当你调用
MyClass.builder().build()时,test字段会自动被设为Optional.empty(),符合默认值预期; - 当你显式设置值,比如
MyClass.builder().test(Optional.of(Test.VALUE1)).build(),则会使用你指定的Optional实例。
如果还是遇到奇怪的null问题,可以尝试清理项目编译缓存(比如Maven的clean命令、Gradle的cleanBuildCache任务),有时候旧的编译缓存会导致Lombok生成的代码异常。
内容的提问来源于stack exchange,提问作者user6467981

