@Build
和 @SuperBuilder
都是 Java 注解,通常与 Lombok 库一起使用,目的是简化对象的构建过程。它们分别属于不同的 Lombok 特性,并且适用于不同的场景。我们来深入探讨这两个注解的区别。
1. @Builder 注解
@Builder
是 Lombok 提供的一个注解,它自动生成一个 建造者模式(Builder Pattern) 的实现。通过使用 @Builder
,可以生成一个流式 API,让我们能够以更简洁的方式创建对象,而无需显式地编写构造器或者使用传统的构建者类。
示例:
使用:
特点:
@Builder
注解通过生成一个PersonBuilder
类,使得我们能够使用链式调用的方式来设置对象的属性。- 适用于类没有继承关系,或者不需要处理继承时的复杂情况。
2. @SuperBuilder 注解
@SuperBuilder
是 Lombok 中 @Builder
的增强版,特别适用于 继承层次结构中的 Builder 模式。当你的类需要继承其他类,并且你希望在构建子类对象时,能够同时设置父类和子类的字段时,@SuperBuilder
就显得尤为重要。
使用 @SuperBuilder
时,Lombok 会自动为父类和子类生成建造者,支持父类和子类属性的构建,并且继承关系中的字段也能通过建造者模式来传递。
示例:
使用:
特点:
@SuperBuilder
支持 继承,它会生成一个PersonBuilder
和一个EmployeeBuilder
,允许我们在构建Employee
对象时同时设置Person
和Employee
中的字段。- 支持 链式调用,即先构建父类字段,再构建子类字段。
@SuperBuilder
会为每个类生成一个独立的建造者,使得父类和子类的字段都能通过建造者进行设置。
3. 区别总结
特性 |
|
|
适用场景 | 用于普通类,适用于没有继承的情况 | 用于继承层次结构中的类,支持父类和子类共同构建 |
生成的 Builder 类 | 为每个类生成一个建造者类 | 为每个类生成一个独立的建造者类,同时支持父类和子类字段的构建 |
继承支持 | 不支持继承层次结构的 Builder | 支持继承层次结构,可以同时构建父类和子类字段 |
功能扩展 | 适用于简单的建造者模式 | 扩展了 |
构建方式 | 使用 | 使用 |
4. 使用场景举例
4.1 使用 @Builder
构建普通类
如果你有一个简单的类,没有继承其他类,使用 @Builder
就足够了:
4.2 使用 @SuperBuilder
构建继承类
如果你有一个父类和子类,并且需要通过建造者模式构建子类对象,使用 @SuperBuilder
:
在这种情况下,@SuperBuilder
自动为 Dog
类生成建造者,并且支持父类 Animal
的字段 name
和 age
通过 Dog.builder()
方法来设置。
5. 总结
@Builder
:适用于普通的类,简单且直接的构建者模式。@SuperBuilder
:适用于有继承关系的类,能够在构建子类时,同时考虑父类的字段。是对@Builder
的增强,支持继承层次结构中的字段构建。
选择使用 @Builder
或 @SuperBuilder
,取决于你的类是否涉及继承关系。如果有继承,使用 @SuperBuilder
可以避免手动编写复杂的建造者代码。