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.mzph.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;确实很遗憾我不能依赖其他稳定的第三方产品。 以下是有关数据库架构导航的一…