gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:20:55 30 4
gpt4 key购买 nike

我想要不可变的 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 设计师认为这样做是一个不错的选择。我同意:它使两个 setter 方法的行为相似;在极少数情况下,您想要重置构建器中的元素,您可以使用 clear方法。

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

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

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

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com