java中方法链通过setter返回this实现,需将返回类型改为当前类并return this;不可变对象应使用builder模式;ide或lombok可自动生成,继承时需注意协变返回类型。

Java 中通过返回 this 实现连续设置(即“方法链”或“流式 API”),本质是让每个 setter 方法不返回 void,而是返回当前对象实例,从而支持链式调用。这不是靠“配置”实现的,而是靠编码约定和设计模式——关键在于方法签名和返回值的设计。
让 setter 返回 this
普通 setter 通常返回 void,要支持链式调用,需将其改为返回 this(即当前对象引用):
- 将方法返回类型从
void改为当前类类型(如Person) - 在方法末尾写
return this; - 确保类是可变的(否则无法多次修改同一实例)
示例:
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;
}
}
调用时即可连续设置:new Person().setName("Alice").setAge(25);
注意构造器与不可变对象的取舍
若希望对象创建后不可变(推荐用于线程安全或逻辑清晰场景),则不应提供可变的 setter 链式方法。此时更适合用构建器模式(Builder Pattern):
- 定义静态内部
Builder类 -
Builder的每个设置方法返回自身(Builder类型) - 最终调用
build()创建不可变实例
这样既保持不可变性,又支持流畅的链式调用。
IDE 和 Lombok 可自动简化
手动改写所有 setter 易出错且繁琐。可用工具辅助:
- IntelliJ IDEA:选中字段 → Generate… → 勾选 Chain calls(生成带
return this的 setter) - Lombok:添加
@Setter注解,默认就生成返回this的 setter;配合@Accessors(fluent = true)还可去掉set前缀
例如:@Accessors(fluent = true) @Setter public class Person { private String name; } → 自动生成 name(String name) 方法并返回 this。
避免在继承体系中误用
若子类继承并重写返回 this 的方法,需小心协变返回类型问题:
- Java 允许子类方法返回更具体的类型(如父类返回
Person,子类可返回Student) - 但若未显式声明,可能因类型擦除导致链式调用中断(如
student.setName(...).enroll()报错) - 建议在子类中明确重写并返回自身类型,或使用泛型自引用(如
<t extends person></t>)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











