根据我在不同地方读到的最佳实践( one example ),最好将 API 和实现分开,但也只导出 API 包中的包而不是实现包中的包,后者应该注册为而是服务。
但是我仍然不清楚你应该如何扩展一个具体的类。在我看来,能够做到
class Child extends com.foo.ParentImpl {
}
impl 包需要公开 com.foo
AFAIU只有两种方法
- 导出具体实现,但这违反了最佳实践
- 切勿从不同的包中扩展类。即,将所有类型层次结构捆绑在一起。在我看来,这违背了模块化框架的要点
那么正确的方法是什么?
最佳答案
您可以将实现类公开为导出 — OSGi 不会阻止您这样做。请注意,您违反了最佳实践。
您可能会说,最佳实践就是要被打破的,在某些情况下您是对的。然而,这个存在确实是有充分理由的! Java 中的继承在基类和子类之间创建了非常紧密的耦合。通过允许其他 bundle 了解您的实现类并可能对它们进行子类化,那么您就严重限制了您在基类中进行实现更改的能力。本质上,实现是 API,因此将来无法更改。
所以我的建议是忘记继承。被高估了。
如果您确实想这样做,请按照您的选项 2 将层次结构保持在一起。
关于java - osgi 导出继承的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17371871/