默认的Java访问修饰符(public,protected,private)是否已经定义了如何访问类的边界。为什么这些改性剂不够?为什么OSGI比这更好地“定义模块边界”?
答案 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访问修饰符则不能。请参见下图。
请注意,在普通旧Java中,无论如何,所有类都可以看到公共类(用绿色箭头表示)。在OSGI中,只有当它是导出包的一部分时,所有类(包括另一个包中的类)才能看到公共类。
注意:图中的“受保护的类”实际上只是没有任何修饰符的类(因为类没有“protected”修饰符,只适用于字段和方法)
编辑:我在这里添加了这个相关的引用:http://njbartlett.name/files/osgibook_preview_20091217.pdf
“每个其他包中的每个类都可以看到公共类;默认访问权限 class仅适用于同一包中的其他类。 这里缺少一些东西。上述访问修饰符与可见性有关 跨包,但Java中的部署单元不是包,它是一个 JAR文件。提供非平凡API的大多数JAR文件包含多个 包(HttpClient有八个),一般JAR中的类需要 有权访问同一JAR的其他包中的类。不幸 这意味着我们必须公开我们的大多数课程,因为这是唯一的 访问修饰符,使类跨包边界可见。 因此,客户可以访问所有公开的类 在JAR之外也是如此。因此整个JAR实际上是公共API, 甚至是我们宁愿隐藏的部分。这是另一个症状 缺少JAR文件的任何运行时表示。“