使用@Builder 的 lombok 中可选数据成员的默认值是什么?
What is the default for Optional data members in lombok using @Builder?
假设我有一个 class 这样的 :
@Builder
class AnIdentifier {
@NonNull //to indicate required to builder
private String mandatoryIdPart;
private Optional<String> optionalIdPart1;
private Optional<String> optionalIdPart2;
}
当客户端使用lombok为这个class生成的构建器创建一个对象并且没有设置可选部分时,它们设置成什么?
此外,客户端是否必须将包装在 Optional 中的值传递给可选部分的构建器?
这是我尝试过的:
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()
其次,从第 1 行开始,设置可选值需要将字符串放入可选值中,lombok 不会处理这个问题。
所以使用像这样的带有注释的构造函数:
@Builder
public AnIdentifier(@NonNull String mandatoryIdPart, String optionalIdPart1, String optionalIdPart2) {
this.mandatoryIdPart = mandatoryIdPart;
this.optionalIdPart1 = Optional.ofNullable(optionalIdPart1);
this.optionalIdPart2 = Optional.ofNullable(optionalIdPart2);
}
从 Lombok 1.16.16 开始,您可以执行以下操作,将其默认为 Optional.empty()
@Builder.Default private Optional<String> optionalIdPart1 = Optional.empty()
见https://projectlombok.org/features/Builder
直到最近 Intellij 还存在这方面的问题,这可能让一些开发人员望而却步,但现在已经解决了
假设我有一个 class 这样的 :
@Builder
class AnIdentifier {
@NonNull //to indicate required to builder
private String mandatoryIdPart;
private Optional<String> optionalIdPart1;
private Optional<String> optionalIdPart2;
}
当客户端使用lombok为这个class生成的构建器创建一个对象并且没有设置可选部分时,它们设置成什么? 此外,客户端是否必须将包装在 Optional 中的值传递给可选部分的构建器?
这是我尝试过的:
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()
其次,从第 1 行开始,设置可选值需要将字符串放入可选值中,lombok 不会处理这个问题。
所以使用像这样的带有注释的构造函数:
@Builder
public AnIdentifier(@NonNull String mandatoryIdPart, String optionalIdPart1, String optionalIdPart2) {
this.mandatoryIdPart = mandatoryIdPart;
this.optionalIdPart1 = Optional.ofNullable(optionalIdPart1);
this.optionalIdPart2 = Optional.ofNullable(optionalIdPart2);
}
从 Lombok 1.16.16 开始,您可以执行以下操作,将其默认为 Optional.empty()
@Builder.Default private Optional<String> optionalIdPart1 = Optional.empty()
见https://projectlombok.org/features/Builder
直到最近 Intellij 还存在这方面的问题,这可能让一些开发人员望而却步,但现在已经解决了