java接口版本控制_为什么要在Java中控制类和接口的可见性
java接口版本控制
維護是軟件開發(fā)的重要方面之一,并且經(jīng)驗證明,保持較低組件可視性的軟件比暴露更多組件的軟件更易于維護。 您不會在一開始就意識到它,但是在重新設(shè)計應(yīng)用程序時會嚴重錯過它。 由于保持向后兼容性是許多應(yīng)用程序的“必須具備”要求,因此最終會打補丁并重復(fù)同樣的錯誤。 您不能做太多事情,因為許多其他應(yīng)用程序與您的類和接口緊密集成在一起。
Java從一開始就提供對訪問修飾符的支持,因此始終將封裝放在優(yōu)先地位。 它提供了三種方法來控制任何類型(例如,類或接口)的可見性,方法是將它們設(shè)置為公共,程序包私有或私有。 保護發(fā)生了什么事,我們不能將保護與類或接口一起使用。 不,您不能,您只能使用兩個具有類型的訪問修飾符,protected不是類或接口的合法修飾符。 另外,頂級類(其名稱與包含它的Java源文件的名稱相同)可以是公共的,也可以是包私有的(沒有任何訪問修飾符),也不能是私有的。
只有嵌套類可以是private,public或package-private 。 每個人都可以訪問公共類,并且它是最可見的。 嘗試僅公開關(guān)鍵接口,在您認為實現(xiàn)完整且成熟之前,切勿公開您的實現(xiàn)。 另一方面,private Type是最不可見的,并且在Java中只有嵌套的類或接口可以是private。 由于它是最不可見的,因此您可以完全控制該類,以通過經(jīng)驗,新技術(shù),工具和重新設(shè)計來更改其行為。 一個聰明的中途是package-private可見性,這也是默認的可見性,沒有像package-private這樣的關(guān)鍵字。 相反,如果您不提供任何訪問修飾符,則Java會假定它是程序包私有的,并隨后使其僅在同一程序包上可見。 如果您的類和接口僅在同一程序包中的其他類之間共享,請使它們成為程序包專用的。 由于客戶端無法訪問它們,因此更改它們也是相對安全的。
除了使用訪問修飾符降低類或接口的可見性之外,還有兩種其他方法可以執(zhí)行此操作,具體取決于您的運行時環(huán)境。 在組件級別,例如在像Websphere,Weblogic或JBoss這樣的Application Server中,可以對實現(xiàn)類進行代理或包裝,以最大程度地減少外部風險。 無論您做什么,總會有某種類型需要暴露給外部世界,但是使用代理或包裝,您仍然可以管理它們。 即使客戶端程序可以加載代理的實現(xiàn)類,它們也將大部分獲得不可變的代理或包裝。 例如,來自Java Servlet API(javax.servlet)的getServletContext()返回javax.servlet.ServletContext的實現(xiàn),該實現(xiàn)通常是不可變的代理,可以履行ServletContext接口中所作的承諾。 應(yīng)用服務(wù)器很可能以不同的javax.servlet.ServletContext接口實現(xiàn)運行。 可以在其他外部暴露的接口(例如ServletRequest,ServletResponse,javax.ejb.EJBContext,javax.ejb.TimerService等)的實現(xiàn)中使用類似的模式。不同的應(yīng)用程序服務(wù)器可以使用不同的實現(xiàn)來支持這些全局接口。
編寫開源庫也是了解控制類和接口可見性需求的一種好方法。 另一個有趣的情況是基于組件的Java應(yīng)用程序服務(wù)器,例如JBoss,WebLogic或WebSphere。 這些服務(wù)器提供低級服務(wù),例如事務(wù)管理,安全性,持久性,對象池等。簡而言之,生產(chǎn)系統(tǒng)使用應(yīng)用程序服務(wù)器的代碼以及應(yīng)用程序的代碼來完美地工作。 為了便于維護(例如在不同的應(yīng)用程序服務(wù)器之間切換),您的應(yīng)用程序和服務(wù)器代碼應(yīng)松耦合,并應(yīng)保持安全距離。 為了安全起見,應(yīng)從用戶應(yīng)用程序中完全隱藏應(yīng)用程序服務(wù)器的內(nèi)部實現(xiàn)類和接口。 如果應(yīng)用程序打包了服務(wù)器包含的相同庫,則必須注意服務(wù)器不要通過線程上下文類加載器無意中加載應(yīng)用程序的版本。
我最喜歡的EnumSet類是控制可見性的另一個有趣示例。 Java設(shè)計人員使其成為避免實例化的抽象類,并提供了工廠方法作為創(chuàng)建該類實例的唯一方法,例如EnumSet.of()或EnumSet.noneOf()方法。 在內(nèi)部,它們具有RegularEnumSet和JumboEnumSet形式的兩個單獨的實現(xiàn),這些實現(xiàn)由靜態(tài)工廠方法根據(jù)鍵Universe的大小自動選擇。 例如,如果給定Enum中的值數(shù)小于64,則使用RegularEnumSet,否則返回JumboEnumSet的實例。 這種設(shè)計的優(yōu)點在于,這兩個實現(xiàn)都是私有包的,這意味著客戶對它們一無所知。 它們對用戶是完全透明的,并且通過將這些類抽象化可以增強安全性,因為您無法創(chuàng)建抽象類的實例 。 這不僅使您可以選擇最合適的實現(xiàn),而且很容易用更新更好的實現(xiàn)來替換它們。 盡管它們是一個非常特殊的類,RegularEnumSet使用一個長值存儲枚舉常量。 恕我直言,這是從JDK本身控制類的可見性的絕佳示例。
簡而言之,通過最小化可見性(還利用了封裝的優(yōu)勢),封裝良好的代碼將更加安全和可維護。 隨著技術(shù)的發(fā)展,無論您今天寫什么,都已經(jīng)過了幾年,所以遵循類設(shè)計的基本原則可以幫助您從更新的工具,庫和JDK實現(xiàn)中獲得最大收益。
翻譯自: https://www.javacodegeeks.com/2014/09/why-you-should-control-visibility-of-class-and-interface-in-java.html
java接口版本控制
總結(jié)
以上是生活随笔為你收集整理的java接口版本控制_为什么要在Java中控制类和接口的可见性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样乌发黑发 乌发黑发的方法
- 下一篇: 十大巅峰网游小说排行榜完结(10本完结高