我正在使用龙目岛@Data和@Builder这样的注释:
@Data
@Builder(toBuilder = true)
class Movie {
// Some other fields here.
private final List<Actor> actors;
}
Run Code Online (Sandbox Code Playgroud)
当我Movie使用构建器创建一个新的,而不指定任何actor时,我希望Lombok将我的List初始化为Collections.emptyList().但这不会发生:
List<Actor> actors = Movie.builder().build().getActors();
System.out.println(actors); // Prints 'null'.
Run Code Online (Sandbox Code Playgroud)
在@Builder注释的文档中,在Vanilla Java(https://projectlombok.org/features/Builder.html)的代码示例中的第55和56行中,我应该看一下代码示例@Singular(https: //projectlombok.org/features/Singular-snippet.html).在这里的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 '[]'.
Run Code Online (Sandbox Code Playgroud)
这是龙目岛的一个错误,还是我做错了什么?根据文档,似乎应该在两种情况下将列表初始化为空列表(因为@Builderdoc指的是@Singulardoc).
Roe*_*ker 46
只有在使用时@Singular,才会得到一个空列表.在Builder文档页面上,它显示:
...使用
@Singular注释,lombok会将该构建器节点视为集合.
没有@Singular,lombok将其视为任何其他对象.所以它将null取而代之的是一个空集合.
披露:我是Lombok开发人员
从 Lombok v1.16.16 开始,您可以默认使用 @Builder 的内部注释来初始化您的集合。例如:
@Data
@Builder
class Movie {
@Builder.Default
private final List<Actor> actors = new ArrayList<>();
}
Run Code Online (Sandbox Code Playgroud)
因此,当您使用构建器创建新电影时,无需指定任何演员:
Movie movie = Movie.builder().build();
movie.getActors(); // Will return instance of ArrayList
Run Code Online (Sandbox Code Playgroud)