Java模塊化方法–模塊,模塊,模塊

我認為每個人都會同意,編寫模塊化應用程序和模塊化通常是一件好事。

但是,從Java和Scala語言以及各種Java / Scala框架來看,對模塊化的支持是怎樣的呢? 有很多不同的方法! 讓我們看看其中的一些。 “保護”以下是指模塊在編譯時或運行時的分離程度。

配套

首先,我們有Java(或Scala)軟件包 。 當組織源代碼時,該概念非常有用。 但是,它不提供編譯時或運行時(受程序包保護的可見性除外,它沒有被廣泛使用)保護,因此很難說程序包對模塊化代碼有任何幫助。 此外,還有很多命名問題,因此也有約定:例如,如果我們有兩種數據讀取器實現,一種使用數據庫,另一種使用文件系統,則相關的類應該進入數據庫和文件系統子包,還是保留在同樣的頂級套餐? 即使類名在專用軟件包中,也應在它們之前加上數據庫和文件系統嗎?

建立子項目

其次,有Maven / SBT模塊/子項目 。 它們提供了編譯時保護,這是一件非常好的事情:現在,我們可以靜態地確保我們的代碼僅引用顯式指定的依賴項中的類。 但是,隨之而來的是一個顯而易見的問題:什么時候一個功能“足夠大”以使其成為一個單獨的Maven模塊? 可以有很多Maven模塊,每個模塊僅包含幾個類(可以是PITA,必須為每個類定義一個單獨的pom,目錄結構),還是應該更大一些? 關于命名約定,包名稱應與模塊名稱相對應嗎? 如果是這樣,我們顯然違反了這里的DRY ;)!

想象一下,我們決定將數據庫和文件系統數據讀取器放入單獨的程序包,maven模塊中并適當命名。 因此,在myapp-database Maven模塊的foo.bar.database包中,我們有一個DatabaseReader(外加10個幫助器類)。 現在是一個簡單的重構:將“數據庫”重命名為“ db”成為一項非常復雜的任務,最肯定的結果是在各個地方使用了各種術語。

OSGi

演進的下一步將是OSGi捆綁包 (或等效地,是JBoss Modules或Project Jigsaw中的 模塊 )。 一個這樣的捆綁包通常是一個(或多個)Maven模塊的產品,但是它也通過適當地限定類加載器的范圍來提供運行時保護。 Maven模塊中的所有問題都是繼承的……另外還需要命名包!

嵌套類/蛋糕圖案

對代碼進行范圍界定的另一種可能性是使用嵌套類 ,甚至更進一步,并在Scala中使用Cake模式 。 除了舊的問題:使用什么軟件包以及如何命名模塊類外,我們還有幾個新問題。 首先,模塊的整個源代碼現在位于一個文件中。 這可能意味著文件很長! 但是,這可能更多是IDE的問題:沒有人說過需要一次編輯一個文件。 編輯器只能顯示一種模塊類/方法(例如在Smalltalk IDE中)。 蛋糕圖案也不是沒有問題 。 而且,嵌套模塊呢?

DI框架

最后,我們有各種DI框架 (例如Guice,Spring或CDI),如果從適當的角度來看,我們在其中定義了可以依賴于其他模塊(由容器注入)的小模塊(類)。 將模塊接口(java接口)與模塊實現(java類)分開,并且僅注入接口也是很常見的。 但是,再次重申,部分靜態地防止注入實現的唯一方法是,我們不得不求助于創建單獨的-api和-impl Maven模塊。

實際上,如果我們采用嵌套類的方法,那么DI框架可能非常適合解決模塊間的依賴關系并為我們完成所有連接(如果我們想避免出現以下情況,這將非常有用:模塊具有新的依賴關系,并且現在必須修改每個使用站點)。

下一個?

綜上所述,我認為支持模塊化的各種方法可以使用某種統一性。 而且,不幸的是,這可能意味著完全偏離我們今天從Java / Scala所了解的:新的軟件包系統,新的構建系統,新的運行時系統。 不幸的是,新的編程語言的出現在該領域提供的內容并不多。

您是否認為應該有一個模塊系統,可在小型(單個類)和大型(類集)中使用? 畢竟, DI容器用來解決依賴關系和實例化類的操作與啟動時MavenOSGi運行時的操作沒有太大不同!

還是模塊固有地具有幾種類型,小型(類級別)和大型(maven模塊/ osgi捆綁包級別)?

最后,也許還有其他一些非基于JVM的語言可以更好地解決模塊化問題(仍然可用)?

參考: 模塊,模塊,模塊…來自我們的JCG合作伙伴 Adam Warski 。

相關文章 :
  • JBoss模塊示例–模塊化Web應用程序
  • 真正的模塊化Web應用程序:為什么沒有開發標準?
  • OSGi將Maven與Equinox結合使用
  • Java最佳實踐系列
  • Java教程和Android教程列表

翻譯自: https://www.javacodegeeks.com/2011/10/java-modularity-approaches-modules.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374096.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374096.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374096.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CentOS 7 安裝記錄

由于centos6.4版本有點老,所以換到centos7。 1.安裝 CentOS 7.0系統安裝配置圖解教程 2.linux設置網卡開機啟動 實質linux是看一個網卡文件的配置,就是/etc/sysconfig/network-scripts/ifcfg-eth0 (這個文件名看你網卡名稱而異,具體你到該目錄…

String使用注意二

public class StringNote_1{ public void fun(){ for(int i1;i<100;i){ System.out.print(i""); //此語句很耗時間影響性能 } System.out.println("100"); } public void fun1(){ String text""; for(int i1;i<100;i){ …

python2clock_控制fps的時鐘Clock類源碼

"""控制fps的時鐘Clock類&#xff0c;本程序用來在循環中控制fps。如何在海龜畫圖中控制fps&#xff1f;這是一個比較重要的問題&#xff0c;否則程序可能有時候快有時候慢。"""import timeimport colorsysfrom turtle import *from random impo…

將mysql的data目錄移走方法

如移動到"/home/mysql/data"&#xff0c;我的mysql是裝在/usr/local/mysql下的 1. 將/usr/local/mysql/data移動到/home/mysql/data mv /usr/local/mysql/data /home/mysql/data 2. 修改啟動文件 vi /usr/local/mysql/support-files/mysql.server 修改如下行&#xf…

Integer注意_享元設計模式

public class IntegerNote{ public static void main(String[] args){ Integer d1100; Integer d2100; System.out.println(d1d2); //true Integer d3129; Integer d4129; System.out.println(d3d4); //false } } /* 究其原因則涉及到java設計中的一個設計模式&am…

使用Spring 3引導Web應用程序

1.概述 這是關于使用Spring 3.1和基于Java的配置來建立RESTfull Web應用程序的系列教程的第一篇。 本文將重點介紹如何引導Web應用程序 &#xff0c;討論如何從XML過渡到Java&#xff0c;而不必完全遷移整個XML配置。 2. Maven <project xmlns"http://maven.apache.o…

通知欄發送消息Notification(可以使用自定義的布局)

一個簡單的應用場景&#xff1a;假如用戶打開Activity以后&#xff0c;按Home鍵&#xff0c;此時Activity 進入-> onPause() -> onStop() 不可見。代碼在此時機發送一個Notification到通知欄。當用戶點擊通知欄的Notification后&#xff0c;又重新onRestart() -> onSt…

退出頁面刪除cookie_Cookie 機制

歡迎關注公眾號 學習資料不會少01「HTTP 協議是無狀態的」對于瀏覽器的每一次請求&#xff0c;服務器都會獨立處理&#xff0c;不與之前或之后的請求發生關聯。這個過程如圖 11-1 所示&#xff0c;3次“請求&#xff0f;響應”之間沒有任何關系。即使是同一個瀏覽器發送了3個請…

【程序員感悟系列】 由一點業務說開去

最近的工作不是很忙&#xff0c;我也趁著這個機會多讀了一些技術的書籍。比如剛讀完的《大話設計模式》&#xff0c;以將故事的形式講述了設計模式的方方面面&#xff0c;感覺還是不錯的。現在看的一本是英國人寫的《企業應用架構模式》。對于web的企業級應用&#xff0c;還是挺…

浮點數使用注意

public class DoubleNote{ public static void main(String[] args){ System.out.println((1.0-0.8)); //結果&#xff1a; 0.19999999999999996 //浮點數“”要慎用 System.out.println((1.0-0.8)0.2)); // false } } /* Java 浮點數表示采用IEE765表示法 */

Oracle WebLogic Java云服務–幕后花絮。

在開放世界方面&#xff0c;發生的一件大事可能是出乎意料的消息&#xff0c;那就是Oracle最終支持云計算發展并提供自己的公共云服務 。 除了官方公告之外&#xff0c;Aquarium上&#xff08; 此處和此處 &#xff09;的內容或多或少都沒有多少內容&#xff0c;您找不到很多信…

QT子窗口及停靠實現

Demo的效果 頭文件中的變量聲明 //退出動作QAction* exit;//菜單欄菜單QMenu* filemenu;QMenu* actiona;//在狀態欄的標簽控件QLabel* label;//兩個停靠窗口QDockWidget *dockwidget;QDockWidget *dockwidget_textbox; CPP源文件中的對象定義 //創建初始化按鈕,將要放到第一個窗…

python關鍵字驅動框架搭建_python webdriver混合驅動測試框架(數據驅動+關鍵字驅動)...

混合驅動&#xff1a;把數據驅動、關鍵字驅動結合起來一起使用testdata.txthttp://www.126.comhttp://www.sohu.comteststep.txtopen||chromevisit||${url}sleep||3主程序腳本hybrid.py#encodingutf-8import refrom selenium import webdriverimport timewith open("tests…

iOS-cocoapods使用方法

1.CocoaPods的安裝及使用:http://code4app.com/article/cocoapods-install-usagehttp://objccn.io/issue-6-4/http://www.jianshu.com/p/5fc15906c53a查看當前的源gem sources -lgem sources --remove https://rubygems.org///等有反應之后再敲入以下命令&#xff0c;添加淘寶鏡…

Tomcat 6連接池配置

Tomcat 6&#xff0c;配置了連接池&#xff0c;可是運行總是報HTTP Status 500 - javax.servlet.ServletException: org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class for connect URL null的錯誤&#xff0c;檢查URL沒有錯啊&#xff01…

Java并發教程–可調用,將來

從Java的第一個發行版開始&#xff0c;Java的美麗之處之一就是我們可以輕松編寫多線程程序并將異步處理引入我們的設計中。 Thread類和Runnable接口與Java的內存管理模型結合使用&#xff0c;意味著可以進行簡單的線程編程。 但是&#xff0c;如第3部分所述&#xff0c; Thread…

python基本運算符_06-Python基礎知識學習---基本運算符

算術運算符python支持的算數運算符與數學上計算的符號使用是一致的(x 5 , y 2)&#xff1a;算術運算符描述示例兩個對象相加x y 7-兩個對象相減x - y 3*兩個對象相乘x * y 10/除&#xff0c;返回值保留整數和小數部分x / y 2.5//整除&#xff0c;只保留整數部分x // y …

java wait()和sleep() 的區別

之前在寫代碼的時候&#xff0c;如果需要讓線程等待一會&#xff0c;就直接使用sleep()方法&#xff0c;一直也沒有出過問題。而wait()方法的出場率很高&#xff0c;每次打一個句點的時候&#xff0c;對象的方法彈出來&#xff0c;總是能看到wait()在其中&#xff0c;wait()是一…

異常:com.microsoft.sqlserver.jdbc.SQLServerException: 將截斷字符串或二進制數據。

com.microsoft.sqlserver.jdbc.SQLServerException: 將截斷字符串或二進制數據。 at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:196) at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:246) a…

Java中的數據庫架構導航

jOOQ的重要組成部分是數據庫架構導航模塊jooq-meta。 代碼生成器使用它來發現相關的架構對象。 我多次被問到為什么我要自己滾動而不使用其他庫&#xff0c;例如SchemaCrawler或SchemaSpy &#xff0c;確實很遺憾我不能依賴其他穩定的第三方產品。 以下是有關數據庫架構導航的一…