Java链式调用的核心是方法返回this,需将setter等方法的返回类型设为当前类并return this;复杂场景推荐Builder模式构建不可变对象;避免在语义不符或final方法中强行链式。

Java 中实现链式调用的核心是:每个方法返回 this(当前对象的引用),让调用可以连续进行。类本身不天然支持链式调用,需要主动设计——关键在于方法的返回类型和返回值。
1. 方法必须返回当前对象(this)
普通 setter 方法默认返回 void,无法链式调用。要支持链式,需将返回类型改为当前类类型,并在方法末尾写 return this;:
public class User {
private String name;
private int age;
public User setName(String name) {
this.name = name;
return this; // ✅ 返回当前对象
}
public User setAge(int age) {
this.age = age;
return this; // ✅ 返回当前对象
}
}
这样就能写:User u = new User().setName("Alice").setAge(25);
2. 构造器与 Builder 模式配合更灵活
如果构造参数多、可选字段多,直接在类里写链式 setter 容易破坏封装或导致对象处于不一致状态。推荐用 Builder 模式:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Builder 是静态内部类,持有目标类的字段副本
- 每个 build 方法(如
name()、age())返回 Builder 自身 - 最后调用
build()创建不可变对象
public class User {
private final String name;
private final int age;
private User(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 User build() {
return new User(this);
}
}
}
// 使用:User u = new User.Builder().name("Bob").age(30).build();
3. 注意不可变对象与线程安全
链式调用常用于构建不可变对象(如 StringBuilder、LocalDateTime),此时方法应返回新对象而非修改自身:
-
StringBuffer.append()修改自身并返回 this(可变) -
String.concat()返回新 String(不可变,不链式) -
LocalDateTime.plusDays()生成新对象并返回(不可变 + 链式)
选择哪一种,取决于你是否允许对象状态被中途修改。业务模型中,多数场景推荐 Builder + 不可变对象,避免意外共享状态。
4. 避免在 void 方法或 final 类中强行链式
以下情况不适合或无法链式:
- 方法职责是执行动作(如
saveToDB()),语义上不该返回对象 - 类被声明为
final且无子类扩展需求,不影响链式,但若方法被final修饰也不妨碍返回 this - getter 方法一般不参与链式(如
getName()返回 String),除非你设计成 Fluent Getter(较少见,易混淆语义)
强行给所有方法加 return this 会损害可读性,链式应服务于清晰的 DSL 风格,不是越多越好。

















