龙目岛@Builder未初始化集合

2022-08-31 20:10:29

我正在使用龙目岛和注释,如下所示:@Data@Builder

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

    // Some other fields here.

    private final List<Actor> actors;

}

当我使用构建器创建一个新的,而不指定任何演员时,我希望龙目岛将我的列表初始化为。但这不会发生:MovieCollections.emptyList()

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

在注释的文档中,在 Vanilla Java 代码示例(https://projectlombok.org/features/Builder.html)的第 55 行和第 56 行中,我应该查看 (https://projectlombok.org/features/Singular-snippet.html) 的代码示例。在 Vanilla Java 示例的第 112 行,列表似乎应该初始化为空列表。@Builder@Singular

我检查了一下,如果我用以下方式注释列表,确实会发生:@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 '[]'.

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


答案 1

只有当您使用 时,才会得到一个空列表。在生成器文档页面上,它说:@Singular

...使用注释,龙目岛会将该构建器节点视为集合。@Singular

如果没有,龙目岛会将其视为任何其他物体。因此,它将不是空的集合。@Singularnull

披露:我是龙目岛开发者


答案 2

从龙目岛 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

推荐