Java Lombok@Builder.Default是';如果要设置null,则不能为@Value对象工作

Java Lombok@Builder.Default是';如果要设置null,则不能为@Value对象工作,java,lombok,Java,Lombok,我正在尝试获取将默认值设置为所有空字段的不可变对象。 因此,我的目标是: import lombok.Builder; import lombok.Value; @Value @Builder public class Test { @Builder.Default String name = "default"; } 我希望这两项测试能够通过: assert Test.builder().build().name == "default&quo

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

import lombok.Builder;
import lombok.Value;

@Value
@Builder
public class Test {
    @Builder.Default
    String name = "default";
}
我希望这两项测试能够通过:

assert Test.builder().build().name == "default"
assert Test.builder().name(null).build().name == "default"
但第二个没有通过

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

Lombok的
@Builder。默认值
会记住是否调用了相应的Builder setter方法。这允许显式覆盖默认值,即使
null
。没有“取消设置”值的内置方法

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

  • name
    中删除默认值和
    @Builder.default
    。然后手动实现一个all args构造函数,该构造函数检查参数
    name
    是否为
    null
    ,并在这种情况下指定默认值

  • 自定义生成器setter方法,以便传递
    null
    将其取消设置:


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

    实际上,如果传递null,则默认值不起作用,这是无效的expected@User-Upvotedon'tsayThanks好的,那么我的问题怎么解决呢?你就不能不叫
    名字吗(空)
    ,当你不想
    name
    成为
    null
    ?我知道这不是你想要的,但对我来说是有意义的。
        public static class TestBuilder {
            public TestBuilder name(String name) {
                this.name$value = name;
                this.name$set = name != null;
                return this;
            }
        }