为了账号安全,请及时绑定邮箱和手机立即绑定

在带有和不带有 @Singular 注释的 Collection 字段上使用复数方法时的不同效果

在带有和不带有 @Singular 注释的 Collection 字段上使用复数方法时的不同效果

PIPIONE 2023-06-28 15:56:58
我想要拥有不可变的 myClass 对象。好的解决方案是使用 @Singular 注释。问题是,当我使用此注释时,方法 elements() 将元素附加到现有列表,而不是创建新列表:假设我们有:@Value@Builder(toBuilder = true)public class MyClass  {    @Singular    private List<String> elemets;}和MyClass.builder().elemets(Arrays.asList("elem1")).elemets(Arrays.asList("elem2")).build();如果没有 @Singular 注释,我们的列表中有 elem2,如果有 @Singular 注释,我们就有 elem1 和 elem2,如果我只想有 elem2,我必须先使用clearElements()。为什么实施方式不同?是否可以在我自己的实现中使用@Singular?使用 @Singular 注释,我无法在 MyClassBuilder 类中实现 elemets(List elemets) 方法,因为我得到:“不支持手动添加 @Singular @Builder 将生成的方法。如果您想手动管理此字段/参数的构建器方面,不要使用@Singular。”
查看完整描述

1 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

首先我要说的是,使用@Singular不一定是最好的解决方案——这取决于您的用例。但是,在大多数情况下,如果您希望确保使用集合的类的不变性,那么这是一个不错的选择。

@Singular其行为方式是因为 Lombok 设计师认为这样做是一个不错的选择。我同意:它使两个 setter 方法的行为相似;在极少数情况下,您想要重置构建器中的元素,您可以使用该clear方法。

@Singular生成相当复杂的代码,这是为了确保效率和不变性等属性(也在重用构建器来生成多个对象时)。当您修改该代码时,很容易违反这些属性。Lombok 阻止你这样做。

如果你真的想修改这方面,你有三个选择:

  • delombok构建器代码,将其复制到您的类中,然后修改它。

  • 添加另一个不同名称的方法,例如clearAndSetElements(List<String>). 但这可能更令人困惑。

  • @Singular自行删除并实现 setter 方法。如果你想要 Lombok 实现的特性,你就必须在实现上付出一些努力;您可以使用delomboked 代码作为灵感。


查看完整回答
反对 回复 2023-06-28
  • 1 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信