我的 OSGi 应用程序使用白板模式来注册特定状态更改的侦听器。我使用 org.apache.felix.scr.annotations 来声明我的服务和组件,而不是手动编码声明性 XML。将我的组件注册为 ChangeListener 的最简单方法如下:
@Component(name="...")
@Service
public class MyComponent implements ChangeListener {
@Override public void changeOccurred(...) {
// ...
}
// ...
}
这是一种 is-a 关系,它将我的组件暴露给任何要求它的人。相反,我希望有一个通过内部类注册我的 ChangeListener 的关系。但是与上面相比,下面的内容非常难看。
@Component(name="...")
public class MyComponent {
private ServiceRegistration registration;
protected final void activate(final ComponentContext context) {
registration = context.getBundleContext()
.registerService(ChangeListener.class.getName(),
new ChangeListener() {
@Override public void changeOccurred(...) {
// ...
}
}, null);
}
protected final void deactivate(final ComponentContext context) {
registration.unregister();
}
// ...
}
有没有更好的方法来实现包含的侦听器,它不是那么冗长但仍然实现内部类的信息隐藏?