为什么人们会引用“能力”;定义模块边界“;作为OSGI的优势?
默认的Java访问修饰符(public、protected、private)是否已经定义了如何访问类的边界。为什么这些修改器不够?为什么OSGI的“定义模型边界”的方法比这更好?是的,java访问修饰符定义了类边界,在某种程度上定义了包的边界,但模块比单个类或包大。您可能想看看是什么解释了封装通过类和模块的过程。简短回答 在模块化系统中,将API与仅导出API的实现分离是非常重要的。不能基于类修饰符执行此操作。OSGi的另一个非常重要的部分是包的版本控制。您必须仅为导出的包分配版本 长答案 尼尔·巴特利特(Neil Bartlett)撰写的以下维基帖子提供了这个问题的更精确答案: 类似问题为什么人们会引用“能力”;定义模块边界“;作为OSGI的优势?,osgi,Osgi,默认的Java访问修饰符(public、protected、private)是否已经定义了如何访问类的边界。为什么这些修改器不够?为什么OSGI的“定义模型边界”的方法比这更好?是的,java访问修饰符定义了类边界,在某种程度上定义了包的边界,但模块比单个类或包大。您可能想看看是什么解释了封装通过类和模块的过程。简短回答 在模块化系统中,将API与仅导出API的实现分离是非常重要的。不能基于类修饰符执行此操作。OSGi的另一个非常重要的部分是包的版本控制。您必须仅为导出的包分配版本 长答案 尼尔
当结构化语言中已有函数可用时,为什么我们需要面向对象?函数不是用来分离算法的逻辑单元吗?我考虑了一下,意识到OSGI的导出机制可以施加一些隐私限制,而普通的Java访问修饰符不能。见下图。 请注意,在普通的旧Java中,公共类对所有类都是可见的(由绿色箭头指示),无论发生什么情况。在OSGI中,只有当公共类是导出包的一部分时,它才对所有类(包括另一个包中的类)可见 注意:图中的“受保护类”实际上只是没有任何修饰符的类(因为类没有“受保护”修饰符,只针对字段和方法) 编辑:我在此添加此相关报价: “其他包中的每个类都可以看到公共类;默认访问权限 类仅对同一包中的其他类可用。 此处缺少一些内容。上面的访问修饰符与可见性相关 跨包,但Java中的部署单元不是包,而是 大多数提供非平凡API的JAR文件包含多个 包(HttpClient有八个),JAR中的类通常需要 访问同一JAR的其他包中的类 这意味着我们必须公开大部分课程,因为这是唯一的选择 访问修饰符,使类跨包边界可见。 因此,客户机可以访问所有声明为公共的类 因此整个JAR实际上是公共API, 甚至是我们希望隐藏的部分。这是另一个症状 JAR文件缺少任何运行时表示。”
谢谢你的回答!我仍然不明白这一部分:“将API与只导出API的实现分离是非常重要的。你不能基于类修饰符这样做。”在OSGI之前难道不存在API吗?您不能创建一个用public修改的API类,并使该类实例化并调用一个单独的用protected(或保留为默认值)修改的“实现”类,以便包外的其他类看不到该实现吗?如果您的实现在逻辑上被分为多个包,不能从外部隐藏这些类。此外,在没有导出包的情况下进行版本控制也会有问题。在OSGi之前,软件包没有版本。只有导出的包需要有一个版本,并且包不会连接到另一个包,而是基于其版本连接到包。