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

Lombok @Builder.Default导致Optional默认值被置空问题咨询

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:02:08