Lombok @Builder 未初始化集合

Lombok @Builder not initializing collections

我正在使用 Lombok 的 @Data@Builder 注释,如下所示:

@Data
@Builder(toBuilder = true)
class Movie {

    // Some other fields here.

    private final List<Actor> actors;

}

当我使用构建器创建新的 Movie 时,没有指定任何参与者,我希望 Lombok 将我的列表初始化为 Collections.emptyList()。但这不会发生:

List<Actor> actors = Movie.builder().build().getActors();
System.out.println(actors); // Prints 'null'.

@Builder 注释的文档中,它在 Vanilla Java (https://projectlombok.org/features/Builder.html) that I should look at the code example for @Singular (https://projectlombok.org/features/Singular-snippet.html) 的代码示例的第 55 行和第 56 行进行了说明。在 Vanilla Java 示例的第 112 行,似乎列表应该初始化为空列表。

我检查了一下,如果我用 @Singular:

注释列表,确实会发生这种情况
@Data
@Builder(toBuilder = true)
class Movie {

    // Some other fields here.

    @Singular
    private final List<Actor> actors;

}

List<Actor> actors = Movie.builder().build().getActors();
System.out.println(actors); // Prints '[]'.

这是 Lombok 中的错误,还是我做错了什么?根据文档,在这两种情况下,列表似乎都应该初始化为空列表(因为 @Builder 文档引用 @Singular 文档)。

仅当您使用 @Singular 时,您会得到一个空列表。在 Builder documentation page 上面写着:

…with the @Singular annotation, lombok will treat that builder node as a collection.

没有 @Singular,lombok 将其视为任何其他对象。所以它将是 null 而不是一个空的集合。

披露:我是 Lombok 开发人员

从Lombok v1.16.16开始,你可以默认使用@Builder的内部注解来初始化你的集合。例如:

@Data
@Builder
class Movie {

@Builder.Default
private final List<Actor> actors = new ArrayList<>();

}

因此,当您使用构建器创建新电影而不指定任何演员时:

Movie movie = Movie.builder().build();
movie.getActors(); // Will return instance of ArrayList