套件應只包含功能上緊密相關的類別與介面。同一套件內的類別可自由存取非 private 成員,若混入無關類別會導致耦合度過高、命名衝突風險增加。
良好的套件結構如同圖書館分類系統,讓開發者快速定位所需元件。例如 com.company.project.service、com.company.project.repository 清楚表達架構分層。
// 來源檔案開頭宣告
package com.myapp.adaptive.neuralnet;
// 目錄結構對應
src/
└── com/
└── myapp/
├── adaptive/ // 父套件:通用自適應演算法
│ ├── neuralnet/ // 子套件:類神經網路實作
│ └── genetic/ // 子套件:遺傳演算法實作
└── util/ // 獨立工具套件
adaptive.genetic 無法存取 adaptive.neuralnet 的 package-private 成員在套件目錄下建立 package-info.java,僅包含套件宣告與 Javadoc 註解:
/**
* 自適應系統核心演算法套件
* 包含類神經網路、遺傳演算法等實作
*
* @version 2.1.0
* @author Architecture Team
* @since 1.0
*/
@PackageSpec(name="Adaptive Core", version="2.1.0")
@DevelopmentModel("open-source")
package com.myapp.adaptive;
| 方法 | 說明 |
|---|---|
getName() | 套件名稱 |
getSpecificationTitle() | 規格標題 (如 Java Platform API Specification) |
getSpecificationVersion() | 規格版本 (如 1.8) |
getSpecificationVendor() | 規格供應商 (如 Oracle) |
getImplementationTitle() | 實作標題 (如 Java Runtime Environment) |
getImplementationVersion() | 實作版本 (如 1.8.0_291) |
getImplementationVendor() | 實作供應商 |
isSealed() | 是否密封 (禁止動態添加類別) |
isSealed(URL) | 指定 URL 來源是否密封 |
Package pkg = Package.getPackage("java.lang");
String specVer = pkg.getSpecificationVersion(); // "1.8"
boolean compatible = pkg.isCompatibleWith("1.7"); // true,向後相容
// 規則:逐段數字比較,缺位視為 0,1.8 > 1.7.0 相容
// 1. 從 Class 物件
Package pkg1 = String.class.getPackage();
// 2. 靜態方法查詢 (由當前類載入器搜尋)
Package pkg2 = Package.getPackage("java.util");
// 3. 取得所有已知套件
Package[] allPkgs = Package.getPackages();
MANIFEST.MF 中宣告:Name: com/myapp/internal/ Sealed: true.internal 後綴package-info.java 記錄版本與職責Package 物件實現執行期版本檢查與相容性驗證