簡體   English   中英

如何構造庫項目的Java代碼?

[英]How to structure Java code of a library project?

我現在有幾年開發Java應用程序的經驗,但這是我第一次開發必須由外部開發人員使用的(Java 8) 因此,除了API之外,我不會公開任何內容(類,方法等)。

因此,我開始在單個程序包中實現它,並將所有內容都保留在默認范圍內,該范圍僅是內部的。

因為實現此功能需要許多類,為了確保可維護性和可測試性,這些類可能會拆分成更多的類,因此我覺得該程序包變得很大。 在一個常規項目中,我會創建很多子包來構造代碼,但這是不可能的,因為這會導致內部類具有公共作用域。

您是否有任何想法或知道任何方式(使用Java 8時可能涉及到構建系統(Maven)或其他建議)來使此類代碼更加結構化,而無需根據需要公開更多類? 這並不是說我不能忍受單個軟件包,只是感覺不對。

這將導致內部類具有公共范圍。

已經開發了此類庫很多年了,這並不是您可能要想象的問題,因為大多數開發人員只會使用某些文檔化的類和方法,而不會在代碼中深入了解他們知道的細節可能會更改並通過升級破壞其解決方案。

簡而言之,如果沒有文檔說明,那么對於大多數開發人員來說,它就不存在。

注意:如果開發人員希望進入您的代碼,則可以使用反射並將其設為私有也無關緊要。 或者,他們可以復制代碼並對其進行修改,然后執行自己喜歡的任何事情。

您正在做的所有事情都是在阻止開發人員如何進入您的代碼,而不是使用反射來做到這一點。

您是否有任何想法或知道任何方法(可能涉及構建系統(Maven)或其他建議)來使此類代碼更結構化?

Java 9的Jigsaw具有更大的控制權。 它使您可以確定將導出到JAR之外的內容。 這樣,您可以擁有可以在除JAR之外的任何地方使用的public成員。

首先,將所有內容打包在一個包中並不是一個好主意,因為將關注點分離是一個關鍵概念。 此外,很難在您當前的代碼狀態下找到公共API。

這意味着您具有用於該API的程序包,該程序包導致具有單個模塊whatever-api (工件名稱)和一個用於實現module-api-impl等的module-api-impl (或更多)。

這也將導致產生單獨的程序包,並將代碼和測試等相互分離,並顯示您需要在何處分離代碼(可能是您意外耦合了核心)。

暴露事物是可以的。 當前的Java不允許這樣正確的分離和對API等的清晰定義(同樣從技術角度而言)。這可以從Java 9開始完成,您實際上可以通過使用適當的模塊將內部事物與公共事物分開。 另一種可能的方式是使用OSGi,它具有這樣的分離以及對公共api和實現的嚴格分離。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM