【问题标题】:Lombok @Builder not initializing collectionsLombok @Builder 未初始化集合
【发布时间】:2015-12-25 19:16:35
【问题描述】:

我正在使用 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) 的代码示例的第 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 '[]'.

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

【问题讨论】:

  • 顺便说一句,我使用的是Lombok 1.16.6版。

标签: java lombok


【解决方案1】:

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

...使用 @Singular 注释,lombok 将把该构建器节点视为一个集合。

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

披露:我是 Lombok 开发人员

【讨论】:

  • 谢谢!顺便说一句,如果集合的变量名不能单数化,@Singular 注释会报错。但是,当您有一个不可数名词作为变量名(例如单词“设备”或“羊”)时,这有点不方便。为什么生成的单数方法不能和复数一样命名,反而报编译错误?
  • 我们的简短研究让我们相信实际软件中使用的这些词并不多。每当龙目岛不确定时,我们都会在安全方面犯错。这不是警告吗?
  • 我意识到我可以像 @Singular("equipment") 这样指定名称,并且它起作用了。感谢您的帮助!
  • 或者您可以使用@Builder.Default 注释并自己初始化该文件。
  • 我尝试使用@Singular,但我的列表仍然为空,而不是空列表...
【解决方案2】:

从 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

【讨论】:

  • 这对我有用(w Lombok v. 1.18.12)。对我来说,这是更好的答案,因为这完全解决了问题(与 OP 相同)而不需要 @Singular 注释,这会改变我不想要的其他 @Builder 行为。
猜你喜欢
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多