Builder方法返回this以实现方法链,使调用如name().age().city().build()连贯简洁;所有配置方法需声明返回Builder类型并return this;build()方法返回目标对象而非this。

在 Java 的 Builder 模式中,返回 this 是实现“方法链”(method chaining)的关键,它让构建对象的过程更简洁、可读性更强。
为什么 Builder 方法要返回 this
Builder 模式的核心目标是分步设置对象属性,同时避免构造函数参数过多或重载混乱。如果每个 setter 方法(如 name()、age())都返回 this(即当前 Builder 实例),就能连续调用多个方法,像这样:
Person person = new Person.Builder().name("Alice").age(30).city("Beijing").build();
这比分开写三行赋值更紧凑,也更符合 Fluent API 的风格。
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
如何正确返回 this
关键点是:所有用于配置的 Builder 方法必须声明返回类型为 Builder 类型本身,并在方法末尾写 return this;。例如:
public static class Builder {
private String name;
private int age;
private String city;
public Builder name(String name) {
this.name = name;
return this; // ← 返回当前 Builder 实例
}
public Builder age(int age) {
this.age = age;
return this;
}
public Builder city(String city) {
this.city = city;
return this;
}
public Person build() {
return new Person(this);
}
}
注意继承场景下的 this 返回类型
如果 Builder 有子类(比如 StudentBuilder 继承 Person.Builder),直接返回 this 可能导致类型丢失。此时推荐使用泛型自引用(Self-type)来保持链式调用不中断:
public static class Builder<T extends Builder<T>> {
protected String name;
@SuppressWarnings("unchecked")
public T name(String name) {
this.name = name;
return (T) this;
}
}
public static class StudentBuilder extends Builder<StudentBuilder> {
private String major;
public StudentBuilder major(String major) {
this.major = major;
return this; // 类型仍是 StudentBuilder
}
}
这样 new StudentBuilder().name("Tom").major("CS").build() 才能正常编译。
build() 方法不返回 this
build() 是链式调用的终点,它负责创建并返回最终的目标对象(如 Person),而不是 Builder 自身。因此它应返回具体类型,且不能继续链式调用其他 Builder 方法:
- ✅ 正确:
public Person build() { return new Person(...); } - ❌ 错误:
public Builder build() { ...; return this; }(语义错误,对象已构建完成)

















