當類別成員**不加任何存取修飾詞**時,即為 friendly(package-private)存取。這是 Java 的預設存取層級,語意為:「同一套件內的所有類別可見,套件外完全不可見」。本文將詳細說明其規則、設計哲學、四種合法存取途徑,以及為何它是「套件內協作」的最佳選擇。
| 存取者位置 | 可否存取 friendly 成員 |
|---|---|
| 同一套件內的類別 | ✅ 可存取 |
| 不同套件的子類別 | ❌ 不可存取(除非同時滿足 protected) |
| 不同套件的非子類別 | ❌ 不可存取 |
關鍵點:friendly **不支援跨套件繼承存取**,這點與 protected 截然不同。
因為它允許**同一套件內的類別互相「交朋友」**:自由存取彼此的非 private 成員,無需公開給全世界。這鼓勵將緊密協作的類別組織在同一套件,形成內聚的功能模組。
friendly 存取權此外,存取器/修改器(Getter/Setter) 是 OOP 規範的標準方式:將欄位 private,提供 public 方法間接存取,支援驗證、副作用、未來遷移。這也是 JavaBeans 的基礎。
| 場景 | 範例 | 理由 |
|---|---|---|
| 套件內資料傳輸物件 (DTO) | class UserData { String name; int age; } | 套件內服務類直接讀寫欄位,無需 Getter/Setter 樣板碼 |
| 內部演算法輔助類 | class PathFinder { Node[] nodes; ... } | 同套件演算法類需高效存取內部結構,外部完全不需知情 |
| 測試程式碼(同套件) | class ServiceTest { void test() { svc.internalState = 5; } } | 單元測試需設定內部狀態驗證邊界條件,放同套件即可友好存取 |
| 建構者/工廠模式 | class ProductBuilder { Product p = new Product(); p.id = 1; ... } | 建構者類別需初始化產品內部欄位,同套件友好存取最自然 |
friendly,僅限同套件protected 或 publicpublic,確需給子類別才加 protectedList 不回傳 ArrayListsrc/test/java/同套件路徑,天然享有 friendly 存取friendly (package-private) 是 Java 獨有的「模組內部可見」機制,完美對應「高內聚、低耦合」中的**內聚**面向:它讓套件內類別無障礙協作,同時向外界展現乾淨的 public 介面。善用它,你的套件將同時具備內部開發效率與外部封裝品質。