《Thinking in Java》第六章聚焦於「存取控制」,這是 Java 封裝特性的基石,也是打造健壯、可維護程式庫的關鍵。本文整理核心觀念,從套件組織到四種存取修飾符,層層深入。
「將會改變的事物,與保持不變的事物分離。」
這是物件導向設計的首要考量。存取修飾符的存在,正是為了讓類別設計者能夠控制哪些內部細節對外可見,哪些必須隱藏,從而實現「介面與實作分離」。
解決類別命名衝突。透過「反轉網域名」慣例(如 com.company.project),確保全域唯一性。
.java 檔案最多只能有一個 public 類別。public 類別名必須與檔案名完全一致(含大小寫)。public 類別屬於「支援類別」,對外不可見。import 只是簡化命名,不影響執行效能。CLASSPATH 指定 .class 檔搜尋根目錄;若為 JAR 檔,需在 CLASSPATH 中指定完整 JAR 路徑而非目錄。package 宣告必須是檔案中第一行非註解程式碼。| 修飾符 | 同類別 | 同套件(非子類別) | 不同套件子類別 | 不同套件非子類別 |
|---|---|---|---|---|
private | ✅ | ❌ | ❌ | ❌ |
default (package) | ✅ | ✅ | ❌ | ❌ |
protected | ✅ | ✅ | ✅ | ❌ |
public | ✅ | ✅ | ✅ | ✅ |
private 能減少共享可變狀態,降低競態條件風險。當基類別設計者希望衍生類別能存取某成員,但不想對全世界公開時使用。注意:不同套件的非子類別無法存取 protected 成員。
同一套件內的類別自動擁有存取權。這鼓勵將關聯緊密的類別歸入同一套件,形成內聚模組。
存取控制實質上是「實作隱藏」。它建立兩個邊界:
public 方法)與實作細節(private 欄位/方法)分離,未來重構時不破壞用戶端代碼。public 類別:任意處可建立實例。每個編譯單元最多一個。default 類別:僅限同套件建立實例。private 或 protected(內部類別除外)。private(單例模式常用手法)。private,只暴露必要的 public 方法。private,透過存取子/修改子方法控制存取。default 存取權簡化套件內協作。protected,僅在明確設計給繼承體系擴充時使用。深入理解存取控制,是從「寫出能跑的代碼」進階到「設計優雅的 API」的必經之路。