兩類角色:類別建立者 vs 用戶端程式設計師
- 類別建立者:設計類別,只公開必要介面,隱藏實作細節;
- 用戶端程式設計師:使用類別建構應用,不應觸碰內部實作。
隱藏目的:防止非預期修改、確保演進自由、降低認知負荷。
介面 vs 實作
- 介面:定義「可對物件發出的請求」(方法簽名);
- 實作:滿足請求的程式碼與資料(隱藏);
- 訊息傳遞模型:呼叫端發送訊息 → 物件決定如何回應(執行對應方法)。
為何需要存取控制?
- 防止誤用:用戶端只需操作介面,不應依賴內部資料結構;
- 支援演進:介面不變時,內部實作可自由重構(優化演算法、換資料結構),不影響用戶端。
Java 四種存取層級
| 修飾詞 | 可見範圍 | 說明 |
public | 所有類別 | 公開 API,公開契約 |
protected | 同套件 + 子類別 | 給繼承者用,慎用 |
package-private (無修飾詞) | 同套件 | 預設,套件內部協作 |
private | 僅本類別 | 核心封裝,完全隱藏 |
最佳實踐
- 欄位永遠 private,透過 getter/setter 控制存取;
- 方法預設
package-private,確需公開才加 public;
protected 僅用於「設計給繼承者覆寫/呼叫」的方法;
- 套件設計時,將緊密協作的類別放同一套件,善用 package-private。
介面與實作分離的價值
介面定義「做什麼」,實作決定「怎麼做」。這分離支援:
- 多型替換(同一介面多種實作);
- 單元測試(Mock 介面);
- 模組化架構(OSGi、JPMS 模組系統)。
總結
Java 透過四層存取控制實作封裝:介面公開、實作隱藏。這不只是語法規則,更是管理複雜度、支援系統長期演進的核心機制。