Builder用法解析
# Builder 用法解析
@Builder
注解是 Lombok 库提供的一个强大特性,它允许开发者以简洁且可读性强的方式创建对象,尤其是对于具有大量可选参数或者复杂构建逻辑的类。以下是 @Builder
注解的使用方法和相关细节:
# 1. 引入 Lombok 依赖
在使用 @Builder
注解之前,确保已将 Lombok 库添加到项目的构建工具(如 Maven 或 Gradle)中。例如,在 Maven 的 pom.xml
文件中添加 Lombok 依赖:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>latest-version</version> <!-- 替换为当前最新版本 -->
<scope>provided</scope>
</dependency>
</dependencies>
2
3
4
5
6
7
8
# 2. 在类或方法上使用 @Builder
注解
# 2.1 类级别 @Builder
将 @Builder
注解应用于类定义上,Lombok 会自动生成一个对应的内部静态类 Builder
,用于以链式调用的方式构建对象。例如:
@Builder
@Getter
public class Person {
private String firstName;
private String lastName;
private Integer age;
private String address;
// 其他字段...
}
2
3
4
5
6
7
8
9
在这个例子中,Lombok 会为 Person
类生成一个名为 PersonBuilder
的内部类,包含与 Person
类字段对应的 setter 方法,并提供一个 build()
方法用于最终创建 Person
对象。使用方式如下:
Person person = Person.builder()
.firstName("John")
.lastName("Doe")
.age(30)
.address("123 Main St.")
.build();
2
3
4
5
6
# 2.2 方法级别 @Builder
如果只想针对某个工厂方法使用 @Builder
,可以将其放在方法上。这样只会为该方法生成一个独立的 Builder 类:
public class Person {
private String firstName;
private String lastName;
private Integer age;
private String address;
@Builder
public static Person createPerson(String firstName, String lastName, int age, String address) {
return new Person(firstName, lastName, age, address);
}
}
2
3
4
5
6
7
8
9
10
11
使用方法:
Person person = Person.createPerson.builder()
.firstName("John")
.lastName("Doe")
.age(30)
.address("123 Main St.")
.build();
2
3
4
5
6
# 3. 属性控制
# 3.1 @Builder.Default
如果希望某些非 final
字段在构建时拥有默认值,可以在这些字段上添加 @Builder.Default
注解:
@Builder
public class Person {
private String firstName;
private String lastName;
@Builder.Default
private Integer age = 18; // 默认年龄为18
private String address;
}
2
3
4
5
6
7
8
# 3.2 隐藏敏感字段
若要防止某些字段出现在 Builder 中,可以使用 @Builder
的 exclude
参数:
@Builder(exclude = {"sensitiveField"})
public class Person {
private String firstName;
private String lastName;
private Integer age;
private String address;
private String sensitiveField; // 不包含在 Builder 中
}
2
3
4
5
6
7
8
# 4. 构建器方法命名
默认情况下,生成的 Builder 类中的方法名与字段名相同。如果需要为某个字段的构建方法指定特定名称,可以使用 @Builder
的 setterPrefix
参数:
@Builder(setterPrefix = "with")
public class Person {
private String firstName;
private String lastName;
private Integer age;
private String address;
}
// 使用时:
Person person = Person.builder()
.withFirstName("John")
.withLastName("Doe")
.withAge(30)
.withAddress("123 Main St.")
.build();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 5. 继承与 @SuperBuilder
对于继承关系中的类,如果需要在子类中使用 Builder 模式,可以使用 @SuperBuilder
注解。@SuperBuilder
会为父类和子类分别生成 Builder 类,子类 Builder 可以正确处理父类的属性:
import lombok.experimental.SuperBuilder;
@SuperBuilder
public abstract class Employee {
private String id;
private String department;
}
public class FullTimeEmployee extends Employee {
private Double salary;
private Integer vacationDays;
}
// 使用时:
FullTimeEmployee employee = FullTimeEmployee.builder()
.id("123")
.department("Sales")
.salary(50000.0)
.vacationDays(20)
.build();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
总结起来,@Builder
注解极大地简化了复杂对象的创建过程,提供了清晰的构建逻辑和可读性良好的代码。通过灵活运用其提供的各种属性和扩展功能,可以满足不同场景下的对象构建需求。同时,注意遵循最佳实践,避免因滥用 Builder 导致的问题,如过度复杂的构建链或默认值失效等情况。