使用@Builder的lombok中可选数据成员的默认值是什么?

时间:2016-03-02 06:04:34

标签: java optional lombok

假设我有一个这样的类:

@Builder
class AnIdentifier {
    @NonNull //to indicate required to builder
    private String mandatoryIdPart;

    private Optional<String> optionalIdPart1;
    private Optional<String> optionalIdPart2;
}

当客户端使用lombok为此类生成的构建器创建对象并且未设置可选部件时,它们设置为什么? 客户端是否也必须将Optional包装的值或仅包含值传递给构建器以获取可选部件?

2 个答案:

答案 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才遇到这个问题,可能会让一些开发人员失望,但他们现在已经解决了