Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么人们会引用“能力”;定义模块边界“;作为OSGI的优势?_Osgi - Fatal编程技术网

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

为什么人们会引用“能力”;定义模块边界“;作为OSGI的优势?,osgi,Osgi,默认的Java访问修饰符(public、protected、private)是否已经定义了如何访问类的边界。为什么这些修改器不够?为什么OSGI的“定义模型边界”的方法比这更好?是的,java访问修饰符定义了类边界,在某种程度上定义了包的边界,但模块比单个类或包大。您可能想看看是什么解释了封装通过类和模块的过程。简短回答 在模块化系统中,将API与仅导出API的实现分离是非常重要的。不能基于类修饰符执行此操作。OSGi的另一个非常重要的部分是包的版本控制。您必须仅为导出的包分配版本 长答案 尼尔

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

是的,java访问修饰符定义了类边界,在某种程度上定义了包的边界,但模块比单个类或包大。您可能想看看是什么解释了封装通过类和模块的过程。

简短回答

在模块化系统中,将API与仅导出API的实现分离是非常重要的。不能基于类修饰符执行此操作。OSGi的另一个非常重要的部分是包的版本控制。您必须仅为导出的包分配版本

长答案

尼尔·巴特利特(Neil Bartlett)撰写的以下维基帖子提供了这个问题的更精确答案:

类似问题


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

我考虑了一下,意识到OSGI的导出机制可以施加一些隐私限制,而普通的Java访问修饰符不能。见下图。

请注意,在普通的旧Java中,公共类对所有类都是可见的(由绿色箭头指示),无论发生什么情况。在OSGI中,只有当公共类是导出包的一部分时,它才对所有类(包括另一个包中的类)可见

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

编辑:我在此添加此相关报价:

“其他包中的每个类都可以看到公共类;默认访问权限 类仅对同一包中的其他类可用。 此处缺少一些内容。上面的访问修饰符与可见性相关 跨包,但Java中的部署单元不是包,而是 大多数提供非平凡API的JAR文件包含多个 包(HttpClient有八个),JAR中的类通常需要 访问同一JAR的其他包中的类 这意味着我们必须公开大部分课程,因为这是唯一的选择 访问修饰符,使类跨包边界可见。 因此,客户机可以访问所有声明为公共的类 因此整个JAR实际上是公共API, 甚至是我们希望隐藏的部分。这是另一个症状 JAR文件缺少任何运行时表示。”


谢谢你的回答!我仍然不明白这一部分:“将API与只导出API的实现分离是非常重要的。你不能基于类修饰符这样做。”在OSGI之前难道不存在API吗?您不能创建一个用public修改的API类,并使该类实例化并调用一个单独的用protected(或保留为默认值)修改的“实现”类,以便包外的其他类看不到该实现吗?如果您的实现在逻辑上被分为多个包,不能从外部隐藏这些类。此外,在没有导出包的情况下进行版本控制也会有问题。在OSGi之前,软件包没有版本。只有导出的包需要有一个版本,并且包不会连接到另一个包,而是基于其版本连接到包。