基于我在不同地方(one example)阅读的最佳实践,理想的是分离API和实现,但也只是导出API包中的包而不是实现包中的包,应该注册作为服务而已。
但是我还不清楚你应该如何扩展一个具体的课程。在我看来,能够做到
class Child extends com.foo.ParentImpl {
}
impl包需要公开com.foo
AFAIU只有两种方式
那么这样做的正确方法是什么?
答案 0 :(得分:4)
您可以将实现类公开为导出 - OSGi不会阻止您这样做。请注意,您违反了最佳做法。
你可能会争辩说,最佳做法是打破的,在某些情况下你是对的。但是,这个确实存在是有充分理由的! Java中的继承在基类和子类之间创建了非常紧密的耦合。通过允许其他bundle可以看到您的实现类并可能将它们子类化,那么严重会限制您在基类中进行实现更改的能力。基本上,实现是 API,因此将来不能更改。
所以我的建议是忘记继承。它被高估了。
如果您确实想要这样做,请按照您的选项编号2将层次结构保持在一起。
答案 1 :(得分:2)
TLDR:分离出API和实现最好留给您作为OSGI服务公开的内容,其实例将从bundle引用。否则只是按原样公开你的课程。
您在OSGI中获得的模块化类型不适合扩展Service类。你最好使用一些设计模式 允许您扩展服务的功能。
我还想知道你想要扩展什么课程,以及它的目的是什么。
现在,如果您绝对必须在服务包之外扩展服务类,那么最好的选择可能是委派。
class MyExtendedService implements Service {
Service service;
//delegate to MyService which also implements Service and
// is pulled from another osgi bundle.
}
现在,如果要定义类似于“事物”的类,如模型或值对象,则可能没有理由使用单独的API和实现类。只是按原样公开它们。