Java 僅支援值傳遞(基本類型傳值、引用類型傳引用值),無原生 ref/out 關鍵字。本文提供 4 種在 Java 中實現「引用傳遞語義」的方案,適用於需在方法內修改調用者變量的場景。
public void modify(int[] wrapper) {
wrapper[0] = 100; // 修改數組內容,調用者可見
}
// 調用
int[] holder = { 10 };
modify(holder);
System.out.println(holder[0]); // 100
優點:簡單、無第三方依賴
缺點:語義不清、易誤用、基本類型需自動裝箱
public final class Mutable<T> {
public T value;
public Mutable(T value) { this.value = value; }
}
// 使用
public void modify(Mutable<Integer> holder) {
holder.value = 200;
}
Mutable<Integer> m = new Mutable<>(10);
modify(m); // m.value 變為 200
優點:語義明確、泛型支援、可擴展驗證邏輯
public static class Result {
public int newValue;
public boolean success;
}
public Result compute(int input) {
Result r = new Result();
r.newValue = input * 2;
r.success = true;
return r;
}
// 調用
Result r = compute(10);
if (r.success) value = r.newValue;
優點:純函數風格、線程安全、無副作用、**最推薦**
public void process(int input, Consumer<Integer> onResult) {
int result = input * 3;
onResult.accept(result);
}
// 調用
process(10, val -> { this.value = val; });
優點:函數式風格、異步友好、關注點分離
| 方案 | 適用場景 | 線程安全 | 推薦指數 |
|---|---|---|---|
| 單元素數組 | 快速原型、測試代碼 | 否 | ⭐ |
| 可變容器類 | 遺留代碼改造、需就地修改 | 否 | ⭐⭐ |
| 返回結果對象 | 新代碼設計、多返回值、函數式風格 | 是 | ⭐⭐⭐⭐⭐ |
| 回調/Consumer | 異步處理、事件驅動、流式 API | 視實現 | ⭐⭐⭐⭐ |
Integer、Long 等不可變,無法通過引用修改內部值List/Map 可在方法內 add/put,但無法替換引用本身理解 Java 傳遞機制本質,選擇符合語言哲學的設計模式,而非強行移植 C# 語法習慣。