假设我有一个这样的类:
@Builder
class AnIdentifier {
@NonNull //to indicate required to builder
private String mandatoryIdPart;
private Optional<String> optionalIdPart1;
private Optional<String> optionalIdPart2;
}
当客户端使用lombok为此类生成的构建器创建对象并且未设置可选部件时,它们设置为什么? 客户端是否也必须将Optional包装的值或仅包含值传递给构建器以获取可选部件?
答案 0 :(得分:1)
以下是我尝试过的内容:
public static void main(String[] args) {
AnIdentifier id = AnIdentifier.builder().mandatoryIdPart("added")
.optionalIdPart1(Optional.of("abs")).build(); //line 1
id.optionalIdPart2.isPresent(); //line2
}
首先,line2生成了一个NPE,因此optionalIdPart2设置为null而不是Optional.empty()
其次来自line1,设置将字符串放在Optional中所需的可选值,lombok不会处理它。
所以使用带有注释的构造函数:
@Builder
public AnIdentifier(@NonNull String mandatoryIdPart, String optionalIdPart1, String optionalIdPart2) {
this.mandatoryIdPart = mandatoryIdPart;
this.optionalIdPart1 = Optional.ofNullable(optionalIdPart1);
this.optionalIdPart2 = Optional.ofNullable(optionalIdPart2);
}
答案 1 :(得分:1)
从Lombok 1.16.16开始,您可以执行以下操作,将其默认为Optional.empty()
@Builder.Default private Optional<String> optionalIdPart1 = Optional.empty()
请参阅https://projectlombok.org/features/Builder
直到最近,Intellij才遇到这个问题,可能会让一些开发人员失望,但他们现在已经解决了