Eclipse 插件開發者對「擴展點」絕不陌生 —— `plugin.xml` 中滿是 `extension point` 與 `extension` 的宣告。但許多開發者經歷三階段:
本文分享判斷「是否需要建立擴展點」的四個核心檢核點,助你避開過度設計陷阱。
打開需求文件,問自己:「客戶或下游團隊是否需要針對此模組進行二次開發,並註冊擴充功能?」
擴展點描述的資訊必須對模組外部可見。若只是模組內部的策略實作類別、資料庫連線池設定、暫存策略等 —— 這些屬於「實作細節」,用 Java 介面 + 依賴注入 (DI) 解決即可,切勿暴露為擴展點。
這是新手最常犯的錯誤:混淆「語言特性」與「平台機制」。
反例: 你有介面 `IPolicy`,實作 `PolicyA`、`PolicyB`,未來可能新增 `PolicyC`。管理類 `PolicyManager` 以靜態列表持有實例。
// 靜態註冊範例 — 完全足夠,無需擴展點
private PolicyManager() {
policyList.add(new PolicyA());
policyList.add(new PolicyB());
}
// 未來新增 PolicyC 時,修改此處重新編譯部署即可
擴展點的價值在於部署期/執行期動態發現與載入 (如 Dropins 目錄、使用者安裝額外插件)。若你的系統:
→ 老實用 Java 介面 + 靜態註冊/建構器注入,別濫用擴展點增加複雜度。
觀察 Eclipse 自身擴展點分佈:
鐵律: 若你的模組是最上層的業務功能 (如「訂單管理」、「報表產生」),且確定沒有其他模組會依賴它 → 不可能存在擴展點。擴展點是給「被依賴者」準備的,葉子節點不需要。
假設你開發一個 IDE,支援自訂專案類型,需針對不同檔案類型調用對應編譯器:
此時,核心建構器邏輯只需:
IExtension[] extensions = Platform.getExtensionRegistry()
.getExtensionPoint("com.myide.compiler")
.getExtensions();
for (IExtension ext : extensions) {
IModelCompiler compiler = (IModelCompiler) ext.createExecutableExtension("class");
// 使用 compiler 編譯對應副檔名檔案
}
這才是擴展點的正統用法:核心流程固定,具體實作由外部動態貢獻。
記住:擴展點是架構邊界的正式契約,一旦發布即難變更。寧可事後補充 (Eclipse 允許後續擴充),不可預先過度設計。保持模組內聚、介面乾淨,才是良好插件架構的基石。