多语言展示
当前在线:1644今日阅读:27今日分享:41

Java模块化概念解惑

什么是模块化?模块化是个一般概念,这一概念也适用于软件开发,可以让软件按模块单独开发,各模块通常都用一个标准化的接口来进行通信。实际上,除了规模大小有区别外,面向对象语言中对象之间的关注点分离与模块化的概念基本一致。通常,把系统划分外多个模块有助于将耦合减至最低,让代码维护更加简单。Java语言并不是按照模块化思想设计的(除了package,按照Java语言规范introduction一 节的介绍,package类似于Modula-3模块),但是在Java社区依然有很多实际存在的模块。任何一个Java类库实际上都是一个模块,无论其 是Log4J、Hibernate还是Tomcat。通常,开源和非开源的应用都会依赖于一个或多个外部类库,而这种依赖关系又有可能传递到其他类库上。类库也是模块类库毫无疑问也是模块。对于类库来讲,可能没有一个单一接口与之通信,但往往却有‘public’ API(可能被用到)和‘private’ package(文档中说明了其用途)。此外,它们也有自己依赖的类库(比如JMX或JMS)。这将引起自动依赖管理器引入许多并非必须的类库:以Log4J-1.2.15为例,引入了超过10个依赖类库(包括javax.mail和javax.jms),尽管这些类库中有不少对于使用Log4J的程序来说根本不需要。 某些情况下,一个模块的依赖可以是可选的;换句话说,该模块可能有一个功能子集缺少依 赖。在上面的例子中,如果JMS没有出现在运行时 classpath中,那么通过JMS记录日志的功能将不可用,但是其他功能还是可以使用的。(Java通过使用延迟链接——deferred linking来达到这一目的:直到要访问一个类时才需要其出现,缺少的依赖可以通过ClassNotFoundException来处理。其他一些平台的弱链接——weak linking概念也是做类似的运行时检查。)通常,模块都附带一个版本号。许多开源项目生成的发行版都是以类似log4j-1.2.15.jar的方式命名的。这样开发者就可以在运行时通过手动方式来检测特定开源类库的版本。可是,程序编译的时候可能使用了另一个不同版本的类库:假定编译时用log4j-1.2.3.jar而运行时用log4j-1.2.15.jar,程序在行为上依然能够保持兼容。即使升级到下一个小版本,仍然是兼容的(这就是为什么log4j 1.3 的问题会导致一个新分支2.0产生,以表示兼容性被打破)。所有这些都是基于惯例而非运行时已知约束。
推荐信息