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

最佳答案

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

@Singular表现出它的行为方式,因为龙目岛(Lombok)设计师认为这样做是一个不错的选择。我同意:这使两个设置方法的行为类似;在极少数情况下要重置构建器中的元素,则可以使用clear方法。

@Singular生成非常复杂的代码(有关示例,请参见https://projectlombok.org/features/BuilderSingular)。这是为了确保效率和不变性之类的属性(也包括在重复使用生成器来生成多个对象时)。弄乱该代码时,您很容易违反这些属性。龙目岛阻止您这样做。

如果您确实要修改此方面,则有三个选择:


delombok构建器代码,将其复制到您的类中,然后对其进行修改。
添加另一个不同名称的方法,例如clearAndSetElements(List<String>)。但这可能更令人困惑。
删除@Singular并自行实现setter方法。如果需要Lombok实现的属性,则必须在实现上付出一些努力。您可以使用delombok编码作为灵感。

关于java - 在带有和不带有@Singular注释的Collection字段上使用复数方法时的不同效果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57711255/

10-10 18:59