现在的位置: 首页 > 综合 > 正文

OSGi (一) 模块化和Java中模块化的弊病

2017年11月14日 ⁄ 综合 ⁄ 共 964字 ⁄ 字号 评论关闭

定义:利用一组逻辑上独立的组件集合设计出完整的系统。


模块定义了逻辑边界,模块自身显示的控制哪些类完全封装不对外显示,哪些类(或者接口)暴漏给其他模块。


模块化和面向对象的比较:
面向对象本身是蕴含模块化思想的。在java等面向对象的语言中,使用访问范围修饰符来限定哪些类或者方法,字段是私有的,哪些是
外界可以访问的。
这种思想和上图中模块化的概念的区别在于:上图的模块化是一组类(通常为一个具有逻辑关系的类集合)和另外一组类之间的可见性
关系,而面向对象针对的是类与类之间的关系。二者的关注粒度不一样。
为什么要使用模块化?
原因和使用面向对象语言的原因一样,采取一种策略,把关注点分离:你设计一个类,在这个类中你可以只关心你要关系你的业务问题。同样,你
设计一组类,这一组类是为了解决某个问题,这一组类成为一个单元,或者一个模块。这样,代码结构清晰,便于维护和升级,例如,
一个模块内的逻辑代码的改变(通常是业务代码,对其他模块不可见),不影响使用者。这就是我们通常说的高内聚,低耦合。
Java本身没有模块化的概念(后续的版本可能会提供)。

由于这些模块化的不足导致java的弊病:
1.引入一个jar包后,这个jar包下面所有的public类对外都是公开的可访问的。不能进行细致的控制,比如这个jar包中,哪些类是可以对外公开的,哪些是私有的。
2.类路径概念导致的多个类版本不能共存。详细点说,在一个工程中,你引入了两个jar包,但是这两个jar包中都含有 org.cc.util.PrintUtil 这个类,那么使用的时候会使用哪一个呢?java的应用程序会采用类路径上最先出现的那个版本,就是说,在类加载器寻找类的时候,先找到哪个,就用那个,第二个会被吞噬,不起作用。
这是由风险的,容易引发类类型不一致的异常。这种场景可以用一下图形表示(看不懂就再看看本段说的话):



3.对于动态性(热加载,热部署)支持的不好。软件应该是这样的:在不停止进程的情况下,动态更新自己的功能模块。这个像是优盘,你可以在不管电脑的情况下插上优盘,被系统识别,接着注册为系统的一个硬件使用。唯一能实现的工具是加载器,但是使用加载器是低级的做法,很容易出错。程序员一般不需要直接和类加载器打交道。当然,类加载器的作用你要明白,这个很关键。
使用模块化,可以规避上述几个问题。


抱歉!评论已关闭.