Lombok Builder (构建器) 自定义 Setter
转自: https://www.baeldung.com/lombok-builder-custom-setter
1. 引言
Project Lombok 作为一个流行的 Java 库,可帮助减少开发人员需要编写的样板代码量。
在本教程中,我们将了解 Lombok 的 @Builder
注解是如何工作的,以及我们如何根据我们的特定需求对其进行自定义。
2. Maven 依赖
让我们首先将依赖项添加到我们的 pom.xml 中:
1 | <dependency> |
3. Lombok Builder (构建器) 注解
在我们研究自定义 Lombok 生成的构建器类之前,让我们快速回顾一下 Lombok @Builder 注解的工作原理。
@Builder
注解可用于为我们的类自动生成构建器。 在示例中,我们将使用一个消息传递系统,其中一个用户可以向另一个用户发送消息。 该消息是一个简单的文本字符串或一个文件。 使用 Lombok,我们可以如下定义我们的 Message 类:
1 |
|
@Data
注解通常生成与简单 POJO(普通旧 Java 对象)相关联的所需样板:所有字段的 getter
,所有非final
字段的 setter
,以及适当的 toString
、equals
和 hashCode
实现以及构造函数。
使用生成的构建器,我们现在可以生成 Message 类的实例:
1 | Message message = Message.builder() |
@Builder
注解还支持属性的默认值,但我们现在不会讨论。 从这个例子中应该可以清楚地看到,@Builder
注解非常强大,可以替代很多样板代码。
4. 自定义 Lombok 构建器
上一节展示了我们如何使用 Lombok 生成构建器类。 但可能存在生成的构建器不够用的情况。 在我们的示例中,我们有一个约束,即消息只能包含文本或文件。 它不能两者兼得。 Lombok 当然不知道这一点,生成的构建器很乐意让我们进入这种非法状态。
幸运的是,我们可以通过自定义构建器来解决这个问题。
自定义 Lombok 构建器非常简单明了:我们编写要自定义的构建器部分,而 Lombok @Builder 注解根本不会生成这些部分。 所以在我们的例子中,这将是:
1 | public static class MessageBuilder { |
请注意,我们不必声明发送者和接收者成员,或与它们关联的构建器方法。 Lombok 仍会为我们生成这些。
如果我们尝试使用以下代码生成包含文本和文件的 Message 实例:
1 | Message message = Message.builder() |
这将导致以下异常:
1 | Exception in thread "main" java.lang.IllegalStateException: Cannot send 'text' and 'file'. |
5. 结论
在这篇快速文章中,我们了解了如何自定义 Lombok 构建器。
代码在 GitHub。