Lombok @Builder不会创建不可变的对象吗?

问题描述 投票:1回答:2

[在许多站点中,我看到lombok @Builder可用于在此处创建不可变对象(https://www.baeldung.com/lombok-builder-singular),也有许多站点称Builder模式主要用于创建不可变对象。

TimeIntervalData td = TimeIntervalData.builder().endTime("12:00").startTime("10:00").build();
td.setEndTime("14:00");
System.out.println(td.getEndTime());

我不确定如何在使用构建器构建的对象上使用setter。我在这里缺少什么吗?

java builder lombok
2个回答
0
投票

是,在用户将类中的参数定义为final的情况下,lombok构建器将不会创建不可变的实例,根据lombok.builder @Builder中的文档,您可以自动生成使类可实例化的代码,例如:

Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();

根据文档,它只是以与外部类中提到的相同的方式创建具有相同属性的内部静态类

用@Builder注释的方法(从现在开始称为目标)将生成以下7件事:

  • 一个内部静态类,名为FooBuilder,具有与静态方法相同的类型参数(称为生成器)。
  • 在构建器中:目标的每个参数都有一个私有的非静态非最终字段。
  • 在构建器中:包私有的无参数空构造函数。
  • 在构建器中:目标的每个参数的类似于'setter'的方法:它具有与该参数相同的类型和相同的名称。它返回构建器本身,以便可以将setter调用链接起来
  • 在构建器中:一个build()方法,该方法调用该方法,并传入每个字段。它返回与目标返回类型相同的类型
  • 在构建器中:明智的toString()实现。
  • 在包含目标的类中:builder()方法,该方法创建构建器的新实例。

但是将@Singular@Builder批注一起用于集合属性会使它们成为单例

通过使用@Singular注释对参数之一(如果使用@Builder注释方法或构造函数)或字段(如果使用@Builder注释类,则lombok会将该生成器节点视为集合,并生成2使用“加法”方法而不是“设置”方法。一个将单个元素添加到集合中,另一个将另一个集合的所有元素添加到集合中。不会生成仅设置集合(替换已添加的内容)的设置器。

@@ Singular仅可应用于lombok已知的集合类型。


0
投票

主要用于创建不可变对象

此说法不正确。主要目的是减少样板代码。使用builder创建的对象更紧凑,更易于编写和阅读。

当您具有1-2个属性时,builder可能会处于劣势,与通过构造函数传递参数相比,builder可能会使代码的可读性降低。

因此,何时使用或不使用生成器是一个问题。

对于设置员:如果需要设置员,可以通过@ Data

注释生成它们。
© www.soinside.com 2019 - 2024. All rights reserved.