返回 this 引用是实现链式调用的核心技巧,要求方法为实例方法、修改状态、返回当前类类型并以 return this; 结束,适用于 builder 模式和流式 api,但不可用于构造器或不可变类的查询方法。

在 Java 中,返回 this 引用是实现链式调用(Method Chaining)的核心技巧。它让多个方法调用可以连续写在同一行,提升代码可读性和流畅性,常见于 Builder 模式、流式 API(如 StringBuilder、Optional)等场景。
基本写法:每个修改类状态的方法返回 this
关键点是:方法必须是实例方法、有实际操作(如设置字段)、且返回类型为当前类类型(不能是 void),最后用 return this; 结束。
- 方法签名需声明返回当前类,例如
public Person setName(String name) - 方法体内完成逻辑后,必须写
return this; - 不能对
final字段赋值(否则编译报错),但可修改其内容(如final List可add())
一个完整示例:Person 类支持链式设置
下面是一个简洁可用的 Person 类:
<font color="#888"><pre class="brush:php;toolbar:false;">public class Person {
private String name;
private int age;
public Person setName(String name) {
this.name = name;
return this; // 返回当前对象引用
}
public Person setAge(int age) {
this.age = age;
return this;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
使用时即可链式调用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
<font color="#888"><pre class="brush:php;toolbar:false;">Person p = new Person()
.setName("Alice")
.setAge(30); // 一行创建并初始化
注意事项和常见陷阱
链式调用虽简洁,但要注意语义与设计一致性:
-
只对“改变自身状态”的方法返回 this:查询类方法(如
getName())不应返回this,否则违反直觉 -
避免在不可变类中滥用:若类设计为不可变(immutable),就该返回新对象,而非
this(比如String的toUpperCase()返回新字符串) -
构造器不能链式调用 this:构造器没有返回值,不能写
return this;;链式初始化需靠静态工厂方法或 Builder 类配合 -
继承场景下谨慎处理返回类型:子类方法若想保持链式并返回子类类型,可用泛型限定(如
<t extends person> T setName(...)</t>),或使用自我类型(Java 14+ 预览特性,暂不推荐生产使用)
进阶:配合 Builder 模式实现更安全的链式构建
如果希望对象创建过程更可控(如必填字段校验、不可变最终对象),推荐组合 Builder:
<font color="#888"><pre class="brush:php;toolbar:false;">public class Person {
private final String name;
private final int age;
private Person(Builder builder) {
this.name = builder.name;
this.age = builder.age;
}
public static class Builder {
private String name;
private int age;
public Builder name(String name) {
this.name = name;
return this;
}
public Builder age(int age) {
this.age = age;
return this;
}
public Person build() {
return new Person(this);
}
}
}
调用方式:
<font color="#888"><pre class="brush:php;toolbar:false;">Person p = new Person.Builder()
.name("Bob")
.age(25)
.build();
这种写法兼顾链式便利性与对象安全性,是工业级常用方案。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










