java - osgi 导出继承的实现

标签 java osgi osgi-bundle

根据我在不同地方读到的最佳实践( one example ),最好将 API 和实现分开,但也只导出 API 包中的包而不是实现包中的包,后者应该注册为而是服务。

但是我仍然不清楚你应该如何扩展一个具体的类。在我看来,能够做到

class Child extends com.foo.ParentImpl {
}

impl 包需要公开 com.foo

AFAIU只有两种方法

  1. 导出具体实现,但这违反了最佳实践
  2. 切勿从不同的包中扩展类。即,将所有类型层次结构捆绑在一起。在我看来,这违背了模块化框架的要点

那么正确的方法是什么?

最佳答案

您可以将实现类公开为导出 — OSGi 不会阻止您这样做。请注意,您违反了最佳实践。

您可能会说,最佳实践就是要被打破的,在某些情况下您是对的。然而,这个存在确实是有充分理由的! Java 中的继承在基类和子类之间创建了非常紧密的耦合。通过允许其他 bundle 了解您的实现类并可能对它们进行子类化,那么您就严重限制了您在基类中进行实现更改的能力。本质上,实现是 API,因此将来无法更改。

所以我的建议是忘记继承。被高估了。

如果您确实想这样做,请按照您的选项 2 将层次结构保持在一起。

关于java - osgi 导出继承的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17371871/

相关文章:

osgi - 在 Maven OSGi 包中使用第 3 方依赖项

java - 如何模拟快餐店的顾客

java - 具有不连续系列折线图的 JFree Chart

osgi - 在 OSGi 控制台中进行的配置保存在哪里?

aem - 如何在AEM中使用第三方JAR?

osgi - Karaf 3.0 缺少 javax.validation 要求

java - 自动化测试时如何使用android默认浏览器

java - 在 Katalon-Studio 中使用 Firebase SDK

java - 将 OSGI 包与 Maven 一起使用时如何隐藏嵌入式依赖项?

eclipse - 使用 Guice/Peaberry 进行 osgi 声明性服务