java链式调用构建器模式核心是builder类中每个setter返回this,目标类构造函数私有;推荐静态内部builder类,支持校验与不可变性;继承时用泛型限定自身类型防类型丢失;lombok@builder可自动生成但默认可变。

Java 中实现链式调用的构建器模式,核心是让每个 setter 方法返回 this(当前对象实例),同时把构造逻辑从构造函数中剥离到独立的 Builder 类中。这种方式既保证了对象的不可变性(可选),又提升了 API 的可读性和使用便利性。
基础 Builder 类设计(推荐方式)
不直接在目标类中实现链式方法,而是单独定义一个静态内部 Builder 类:
- Builder 类持有目标类所有必需/可选字段的副本
- 每个
setXxx()方法设置对应字段并 return this - 提供
build()方法完成最终对象创建(通常校验必填项) - 目标类构造函数设为
private,仅 Builder 可访问
示例:
public class User {
private final String name;
private final int age;
private final String email;
private User(Builder builder) {
this.name = builder.name;
this.age = builder.age;
this.email = builder.email;
}
public static class Builder {
private String name;
private int age;
private String email;
public Builder name(String name) {
this.name = name;
return this;
}
public Builder age(int age) {
this.age = age;
return this;
}
public Builder email(String email) {
this.email = email;
return this;
}
public User build() {
if (name == null || name.trim().isEmpty()) {
throw new IllegalStateException("name is required");
}
return new User(this);
}
}
}
使用时:new User.Builder().name("Alice").age(30).email("a@b.com").build();
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
继承场景下的链式 Builder(避免类型丢失)
如果子类也要支持链式构建,直接继承父类 Builder 会导致 return this 返回父类类型。解决方法是用泛型限定自身类型:
- 父类 Builder 声明为
class Builder<t extends builder>></t> - 每个 setter 返回
T,并用self()方法强制返回子类实例 - 子类 Builder 继承时指定自身为泛型实参
这样调用链中不会因向上转型而丢失子类方法。
简化写法:Lombok @Builder(开发提效)
若项目允许使用 Lombok,加一个注解即可自动生成 Builder:
@Builder
public class User {
private String name;
private int age;
private String email;
}
编译后自动产生 User.builder().name("...").age(...).build()。注意它默认生成的是可变对象,如需不可变,配合 @Value 或手动设字段为 final 并调整构造逻辑。
注意事项与常见坑
- Builder 实例不是线程安全的,不要复用或共享未完成的 Builder
- build() 前应校验必填字段,避免构造出非法状态的对象
- 避免在 Builder 中做重资源操作(如 IO、DB 调用),保持构建过程轻量
- 如果字段有依赖关系(如 setEndDate() 要求 startDate 已设置),可在对应方法中检查并抛异常
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










