使用@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 还存在这方面的问题,这可能让一些开发人员望而却步,但现在已经解决了