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

我想要拥有不可变的 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。”


PIPIONE
浏览 131回答 1
1回答

白衣染霜花

首先我要说的是,使用@Singular不一定是最好的解决方案——这取决于您的用例。但是,在大多数情况下,如果您希望确保使用集合的类的不变性,那么这是一个不错的选择。@Singular其行为方式是因为 Lombok 设计师认为这样做是一个不错的选择。我同意:它使两个 setter 方法的行为相似;在极少数情况下,您想要重置构建器中的元素,您可以使用该clear方法。@Singular生成相当复杂的代码,这是为了确保效率和不变性等属性(也在重用构建器来生成多个对象时)。当您修改该代码时,很容易违反这些属性。Lombok 阻止你这样做。如果你真的想修改这方面,你有三个选择:delombok构建器代码,将其复制到您的类中,然后修改它。添加另一个不同名称的方法,例如clearAndSetElements(List<String>). 但这可能更令人困惑。@Singular自行删除并实现 setter 方法。如果你想要 Lombok 实现的特性,你就必须在实现上付出一些努力;您可以使用delomboked 代码作为灵感。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java