gpt4 book ai didi

java-8 - Lombok @Builder.Default 强制默认可选值为 null

转载 作者:行者123 更新时间:2023-12-02 03:38:04 24 4
gpt4 key购买 nike

在我的代码中,我有一个如下所示的类

public enum Test {
VALUE1,
VALUE2
}

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class MyClass {
@JsonProperty(name = "test")
private Optional<Test> test = Optional.empty();

}

这工作正常,但会出现以下错误:

warning: @Builder will ignore the initializing expression entirely.

太好了,让我添加@Builder.Default...

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class MyClass {
@Builder.Default
@JsonProperty(name = "test", required = true)
private Optional<Test> test = Optional.empty();
}

这修复了错误,但现在 test 值在不存在时被强制为 null,而不是 Optional.empty。我想保留可选模式并让对象的用户决定他们想要如何处理可选,而不是 Lombok 或 Jackson。

有没有办法让这个工作保持默认值Optional.empty()?如果没有,有没有办法可以忽略这个警告,因为它无法修复?

编辑:

假设我们将一个有效负载传递到某个空端点(因为我们想要测试对象中only值的可选值)

POST/my/end/point

负载将为{}

然后我们使用 Jackson 取回对象

MyClass result = mapper.readValue(payload, MyClass.class);

当我们查看结果对象时,我们会发现 MyClass.testnull 而不是预期的 Optional.empty()当使用 @Builder.Default 时。否则,我们会收到上面的警告,但默认值被正确指定为 Optional.empty()

最佳答案

存在代码风格问题。让 Lombok 为可选字段生成 getter/setter/constructor/builder 会产生以下结果:

public MyClass(Optional<Test> test) {
this.test = test;
}

public Optional<Test> getTest() {
return test;
}

public void setTest(Optional<Test> test) {
this.test = test;
}

// ... imagine Builder here ...

getter 还好,但是构造函数、setter 和 Builder 使用起来很不方便。您必须使用 Optional 上的静态方法之一来包装 Test,如下所示:

// If value is known
myClass.setTest(Optional.of(Test.VALUE1));

// If initializing with a variable which maybe null
myClass.setTest(Optional.ofNullable(anotherTest));

太丑了。有更好的方法。
我假设您只需要 getter 的返回类型为 Optional,因此请提供您自己的 getter 实现,强制 Lombok 不生成它自己的。

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class MyClass {

@JsonProperty(name = "test", required = true)
private Test test;

public Optional<Test> getTest() {
return Optional.ofNullable(test);
}
}

智慧之源:Optionals and Lombok @ Medium

关于java-8 - Lombok @Builder.Default 强制默认可选值为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49566633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com