首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 流式介面(Fluent API)實作:方法鏈讓程式碼像語言一樣流暢

     編輯:Java 相關知識

從 Setter 回傳 void 到回傳 this:Builder 模式的輕量級變體

jQuery $("#id").css().slideUp()、Stream API .filter().map().collect()、StringBuilder .append().append() 皆為方法鏈。核心規則:每個修改狀態的方法回傳 this。本文對比傳統 Setter 與鏈式寫法,展示 Person 類的轉型過程。

傳統 vs 鏈式

// 傳統:逐行呼叫,冗長
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();

關鍵修改:回傳 this

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

注意事項

  • 不可變物件:若類為不可變,Setter 應回傳新實例(如 BigDecimal.add()、LocalDate.plusDays()),而非 this。
  • 繼承陷阱:父類方法回傳父類型,子類鏈式調用父類方法後失去子類型方法。解法:泛型自限定 class Parent<T extends Parent<T>> { T setX() { return (T)this; } }。
  • 除錯困難:單行過長難以打斷點;建議適度換行或拆分關鍵步驟。
  • Null 安全:鏈中任一環回傳 null 會拋 NPE;可用 Optional 或 Null Object Pattern 包裝。

實戰擴展:自訂 DSL 範例

// 類 SQL 查詢建構器
Query.select("id", "name")
     .from("users")
     .where("age > ?", 18)
     .orderBy("created_at DESC")
     .limit(10)
     .execute();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved