1

我有一个父类和一个子类,我正在使用@SuperBuilder它来构建子对象,但似乎它根本没有初始化。我的父类如下所示:

@Getter
@Setter
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@SuperBuilder
public class MessageResponse {
    String responseMessage;
}

我的孩子班看起来像这样:

@Getter
@Setter
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@SuperBuilder
public class ListResponse extends MessageResponse {
    List<Item> itemList;
    int itemCount;
}

Item一个Serializable类。

最初ListResponse

itemList = null
itemCount = 0
responseMessage = null

当我尝试ListResponse使用构建器构建时,它根本不会更改ListResponse对象。我正在尝试构建

//listResponse is @Autowired from Spring and is initially as shown above. 
List<Item> itemList = getItems(); // It returns a list of 15 items, i have checked in debugger, It does.
listResponse.builder()
        .bucketList(itemList)
        .responseMessage("Item List.")
        .bucketCount(itemList.size())
        .build();

即使执行.build()完这个listResponse对象的内容仍然是(null, 0 , null).

我试图搜索有关的其他参考资料@SuperBuilder@Builder但没有得到任何结果。有人可以指出这里出了什么问题吗?

4

1 回答 1

1

构建器总是创建一个新实例。这是构建器模式的目的,也是构建器的工作方式,无论您使用 Lombok 的@SuperBuilder@Builder还是手动构建器实现。

您可以看到该builder()方法是一个static方法,因此它无法访问实例(通常您的 IDE 应该在这里给您一个警告,建议您改为编写ListResponse.builder())。

如果要使用预先填充了现有实例中的字段的构建器来创建新实例,则可以将toBuilder = true其用作注释参数 on @(Super)Builder。然后调用listResponse.toBuilder()

如果要修改实例,构建器模式不是正确的选择。改用二传手。Lombok 也可以以流畅、可链接的方式生成这些内容;详情见@Accessors

于 2020-03-12T21:09:59.887 回答