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

Java 友好存取(package-private)完整指南:套件內協作的預設選擇

     編輯:Java 相關知識

當類別成員**不加任何存取修飾詞**時,即為 friendly(package-private)存取。這是 Java 的預設存取層級,語意為:「同一套件內的所有類別可見,套件外完全不可見」。本文將詳細說明其規則、設計哲學、四種合法存取途徑,以及為何它是「套件內協作」的最佳選擇。

friendly 存取精確規則

存取者位置可否存取 friendly 成員
同一套件內的類別✅ 可存取
不同套件的子類別❌ 不可存取(除非同時滿足 protected)
不同套件的非子類別❌ 不可存取

關鍵點:friendly **不支援跨套件繼承存取**,這點與 protected 截然不同。

為何稱為「友好」?

因為它允許**同一套件內的類別互相「交朋友」**:自由存取彼此的非 private 成員,無需公開給全世界。這鼓勵將緊密協作的類別組織在同一套件,形成內聚的功能模組。

套件所有權與存取控制

  • 你**擁有**套件內的代碼 → 你可以讓類別互相「友好」存取
  • 外部套件**無法偽裝**成「朋友」:無任何語法機制能竊取 friendly 存取權
  • 這保證了存取控制的**完整性**:只有代碼擁有者能決定內部協作邊界

四種合法存取成員的途徑(由寬到嚴)

  1. public:所有人、任何地方可存取 → 公開契約
  2. friendly (package-private):同套件類別可存取 → 內部協作
  3. protected:同套件 + 不同套件子類別可存取 → 繼承擴充點
  4. private:僅宣告類別本身可存取 → 內部實作細節

此外,存取器/修改器(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; ... }建構者類別需初始化產品內部欄位,同套件友好存取最自然

常見誤區

  1. 誤以為「預設 = public」:預設是 friendly,僅限同套件
  2. 跨套件子類別試圖存取 friendly 成員:編譯錯誤,需改 protected 或 public
  3. 正式專案使用預設套件:導致所有類例隱性變「友好」,喪失封裝邊界

最佳實務建議

  1. 預設成員用 friendly:只有確須對外公開才加 public,確需給子類別才加 protected
  2. 緊密協作的類別放同一套件:善用 friendly 降低樣板碼,提高內聚
  3. 公開 API 嚴格用 public + 介面型別:回傳 List 不回傳 ArrayList
  4. 測試代碼放同套件(非 src/main):Maven/Gradle 慣例 src/test/java/同套件路徑,天然享有 friendly 存取

總結

friendly (package-private) 是 Java 獨有的「模組內部可見」機制,完美對應「高內聚、低耦合」中的**內聚**面向:它讓套件內類別無障礙協作,同時向外界展現乾淨的 public 介面。善用它,你的套件將同時具備內部開發效率與外部封裝品質。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved