jQuery $("#id").css().slideUp()、Stream API .filter().map().collect()、StringBuilder .append().append() 皆為方法鏈。核心規則:每個修改狀態的方法回傳 this。本文對比傳統 Setter 與鏈式寫法,展示 Person 類的轉型過程。
// 傳統:逐行呼叫,冗長
Person p = new Person();
p.setId(3);
p.setName("John");
p.setPhone("1111111");
p.setAddress("US");
p.printId(); p.printName(); ...
// 鏈式:一氣呵成,可讀性強
Person p = new Person()
.setId(3).setName("John").setPhone("1111111").setAddress("US")
.printId().printName().printPhone().printAddress();
public class Person {
private int id; private String name, phone, address;
public Person setId(int id) { this.id = id; return this; }
public Person setName(String name) { this.name = name; return this; }
// ... 其他 setter 同理
public Person printId() { System.out.println(id); return this; }
// ... 印印方法也回傳 this 以便繼續鏈式
}
| 模式 | 特徵 | 典型例子 |
|---|---|---|
| 方法鏈 | 修改器回傳 this,同一物件持續修改 | StringBuilder, StringJoiner, Mockito when/then |
| Builder | 獨立 Builder 類,build() 產出不可變物件 | StringBuilder 本身、Lombok @Builder、HttpRequest.Builder |
| Fluent Interface | 語義化方法命名,構建領域特定語言 (DSL) | jQuery, AssertJ, RestAssured, QueryDSL |
BigDecimal.add()、LocalDate.plusDays()),而非 this。class Parent<T extends Parent<T>> { T setX() { return (T)this; } }。Optional 或 Null Object Pattern 包裝。// 類 SQL 查詢建構器
Query.select("id", "name")
.from("users")
.where("age > ?", 18)
.orderBy("created_at DESC")
.limit(10)
.execute();