为什么人们引用“定义模块边界”作为OSGI的优势的能力?

时间:2014-11-19 21:34:46

标签: osgi

默认的Java访问修饰符(public,protected,private)是否已经定义了如何访问类的边界。为什么这些改性剂不够?为什么OSGI比这更好地“定义模块边界”?

3 个答案:

答案 0 :(得分:4)

是的,java访问修饰符定义了类边界,并在某种程度上定义了包的边界,但模块大于单个类或包。您可能希望看到http://www.slideshare.net/bjhargrave/why-osgi,它解释了通过类和模块封装的进展。

答案 1 :(得分:3)

简短回答

在模块化系统中,将API与仅导出API的实现分开非常重要。你不能基于类修饰符来做到这一点。 OSGi的另一个非常重要的部分是软件包的版本控制。您只需将版本分配给导出的那些包。

答案很长

Neil Bartlett撰写的以下wiki帖子提供了对这个问题更精确的回答:http://wiki.osgi.org/wiki/Export_Only_APIs

类似问题

为什么在结构化语言中已有功能时我们需要面向对象?用于分离算法逻辑单元的函数不是吗?

答案 2 :(得分:0)

我考虑了一下,并意识到OSGI的导出机制可能会施加某些隐私限制,而普通的旧Java访问修饰符则不能。请参见下图。 enter image description here enter image description here

请注意,在普通旧Java中,无论如何,所有类都可以看到公共类(用绿色箭头表示)。在OSGI中,只有当它是导出包的一部分时,所有类(包括另一个包中的类)才能看到公共类。

注意:图中的“受保护的类”实际上只是没有任何修饰符的类(因为类没有“protected”修饰符,只适用于字段和方法)

编辑:我在这里添加了这个相关的引用:http://njbartlett.name/files/osgibook_preview_20091217.pdf

  

“每个其他包中的每个类都可以看到公共类;默认访问权限   class仅适用于同一包中的其他类。   这里缺少一些东西。上述访问修饰符与可见性有关   跨包,但Java中的部署单元不是包,它是一个   JAR文件。提供非平凡API的大多数JAR文件包含多个   包(HttpClient有八个),一般JAR中的类需要   有权访问同一JAR的其他包中的类。不幸   这意味着我们必须公开我们的大多数课程,因为这是唯一的   访问修饰符,使类跨包边界可见。   因此,客户可以访问所有公开的类   在JAR之外也是如此。因此整个JAR实际上是公共API,   甚至是我们宁愿隐藏的部分。这是另一个症状   缺少JAR文件的任何运行时表示。“