Lombok Builder (构建器) 自定义 Setter

转自: https://www.baeldung.com/lombok-builder-custom-setter

1. 引言

Project Lombok 作为一个流行的 Java 库,可帮助减少开发人员需要编写的样板代码量。

在本教程中,我们将了解 Lombok 的 @Builder 注解是如何工作的,以及我们如何根据我们的特定需求对其进行自定义。

2. Maven 依赖

让我们首先将依赖项添加到我们的 pom.xml 中:

1
2
3
4
5
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>

3. Lombok Builder (构建器) 注解

在我们研究自定义 Lombok 生成的构建器类之前,让我们快速回顾一下 Lombok @Builder 注解的工作原理。

@Builder 注解可用于为我们的类自动生成构建器。 在示例中,我们将使用一个消息传递系统,其中一个用户可以向另一个用户发送消息。 该消息是一个简单的文本字符串或一个文件。 使用 Lombok,我们可以如下定义我们的 Message 类:

1
2
3
4
5
6
7
8
@Builder
@Data
public class Message {
private String sender;
private String recipient;
private String text;
private File file;
}

@Data 注解通常生成与简单 POJO(普通旧 Java 对象)相关联的所需样板:所有字段的 getter,所有非final字段的 setter,以及适当的 toStringequalshashCode 实现以及构造函数。

使用生成的构建器,我们现在可以生成 Message 类的实例:

1
2
3
4
5
Message message = Message.builder()
.sender("user@somedomain.com")
.recipient("someuser@otherdomain.com")
.text("How are you today?")
.build();

@Builder 注解还支持属性的默认值,但我们现在不会讨论。 从这个例子中应该可以清楚地看到,@Builder 注解非常强大,可以替代很多样板代码。

4. 自定义 Lombok 构建器

上一节展示了我们如何使用 Lombok 生成构建器类。 但可能存在生成的构建器不够用的情况。 在我们的示例中,我们有一个约束,即消息只能包含文本或文件。 它不能两者兼得。 Lombok 当然不知道这一点,生成的构建器很乐意让我们进入这种非法状态。

幸运的是,我们可以通过自定义构建器来解决这个问题。

自定义 Lombok 构建器非常简单明了:我们编写要自定义的构建器部分,而 Lombok @Builder 注解根本不会生成这些部分。 所以在我们的例子中,这将是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static class MessageBuilder {
private String text;
private File file;

public MessageBuilder text(String text) {
this.text = text;
verifyTextOrFile();
return this;
}

public MessageBuilder file(File file) {
this.file = file;
verifyTextOrFile();
return this;
}

private void verifyTextOrFile() {
if (text != null && file != null) {
throw new IllegalStateException("Cannot send 'text' and 'file'.");
}
}
}

请注意,我们不必声明发送者和接收者成员,或与它们关联的构建器方法。 Lombok 仍会为我们生成这些。

如果我们尝试使用以下代码生成包含文本和文件的 Message 实例:

1
2
3
4
5
6
Message message = Message.builder()
.sender("user@somedomain.com")
.recipient("someuser@otherdomain.com")
.text("How are you today?")
.file(new File("/path/to/file"))
.build();

这将导致以下异常:

1
Exception in thread "main" java.lang.IllegalStateException: Cannot send 'text' and 'file'.

5. 结论

在这篇快速文章中,我们了解了如何自定义 Lombok 构建器。

代码在  GitHub