2014-10-01 82 views
4

有什麼選項可以用Java定義到Java庫的公共接口。用Java定義公共庫接口

例如,我經常發現事情是公開的,因爲庫中的另一個包需要它們(雖然仍有一個公共基礎包,例如com.stackoverflow.mylib),所以它們不能具有包訪問級別,並且通常人們並不想要大量的包(這似乎是人們使用Spring堅持要有單獨的controller/service/model/impl/etc包,導致一個單獨的「特性」被迫跨越很多包,當說一個給定的服務可能是一個完全內部的實現細節而不是外部使用......)。

因此,理想的目標是讓我向第三方提供的Jar清楚地說明這些東西是不會被使用的,理想情況下根本沒有它們可用(不存在於API jar中),這樣他們不可能使用和編譯這些內部對象/方法。

對於那些只能從某種工廠(例如提供的Spring Bean)中獲得的對象來說,更爲理想的方法是防止直接從它們的代碼或自定義bean實例化(這可能會留下一些未來的,尚不存在的屬性升級後未初始化)。

我知道目前兩家正規方法是:

  • 在一些項目中我曾上,有一個API包(如com.stackoverflow.mylib.api),而規則是隻這個包的內容可以由外部用戶直接訪問。
  • 在我工作過的其他一些項目中,有一些自定義屬性,例如@PublicSDK標記公共對象和方法(我認爲一些額外的東西,以確保只標記的東西在公開分發的javadoc和api jar)。
+1

發表評論或做/建議編輯不只是近距離投票......我想知道什麼技術選項(即列出任何相關的專業人士的意見)爲給定的情況(圖書館代碼)。 – 2014-10-01 23:06:27

回答

1

首先要問自己的是 - 你真的需要隱藏實現細節嗎

我這樣說的原因是,這樣做會涉及費用,這取決於您的情況可能或不值得支付。

例如,如果您的API正在由您的直屬團隊以外的開發人員使用,那麼這可能是值得的;然而,如果僅僅是隱藏你的團隊中的實現細節,我認爲這是過度的。

如果API用於您的項目中,那麼您試圖僅依賴於抽象類型或接口的標準是足夠的(並且已經是標準)。

但是,假設您確實需要隱藏實現並只公開API,那麼我所知道的最好方法是生成兩個jar包 - 一個包含公共API,另一個包含該API的實現。

如果您使用Maven或Gradle構建使用API​​的項目,只需聲明API jar(工件)的編譯時依賴關係和實現jar(工件)上的運行時依賴項。

這個模式可以在整個常見Java API中看到,最新的例子是作爲Glassfish的一部分單獨實現的JSON API

+0

根據我的經驗是,對於常見模塊去其他幾個團隊(或公衆),並且一般人們編碼到IDE所說的,它有一個文檔(他們可能沒有真正閱讀)並將其顯示爲公共(所以沒有編譯警告/錯誤)。然後,他們拒絕/沒有資源來改變它,所以卡住支持這種內部事物的行爲(因爲該jar需要向後兼容很大程度,以防止在客戶服務器上的困難升級情況)... – 2014-10-01 09:56:34

+0

那麼,如何兩罐產生?這聽起來很像我的第二種方法(使用屬性從API jar中刪除東西) – 2014-10-01 09:58:24

+0

簡單的兩個項目 - 一個生成公共API,另一個生成實現。如果您使用的是Maven,那麼避免使用多模塊pom的誘惑 - 您將鎖定自己隨每次發佈的實現一起釋放公共API,這在嘗試執行僅錯誤修復的bug修復版本時非常痛苦實施 – 2014-10-01 10:02:05