如果设置 null,Lombok @Builder.Default 不适用于 @Value 对象

Sou*_*Cub 3 java lombok

我正在尝试获取将默认值设置为所有空字段的不可变对象。所以我的目标是:

import lombok.Builder;
import lombok.Value;

@Value
@Builder
public class Test {
    @Builder.Default
    String name = "default";
}
Run Code Online (Sandbox Code Playgroud)

我希望这两个测试能够通过:

assert Test.builder().build().name == "default"
assert Test.builder().name(null).build().name == "default"
Run Code Online (Sandbox Code Playgroud)

但第二个没有通过。

在这种情况下,我如何告诉 lombok 不要实际设置为 null?我有来自另一项服务的价值,并且它可以为空。如果它对我来说为空,我想使用默认值。

Jan*_*eke 5

Lombok 会@Builder.Default记住相应的构建器 setter 方法是否已被调用。这允许显式覆盖默认值,即使使用null. 没有内置方法可以“取消设置”该值。

有两种方法可以解决这个问题:

  1. @Builder.Default从 中删除默认值 和name。然后手动实现一个全参数构造函数,检查参数是否name为参数null,并在这种情况下分配默认值。

  2. 自定义构建器 setter 方法,以便传递null将取消设置它:

    public static class TestBuilder {
        public TestBuilder name(String name) {
            this.name$value = name;
            this.name$set = name != null;
            return this;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我建议您使用后一种方法,因为这样您就不必每次在该类中添加或删除字段时都修改手动全参数构造函数。