我的OSGi应用程序使用白板模式为特定状态更改注册侦听器。我使用org.apache.felix.scr.annotations来声明我的服务和组件,而不是手工编写声明性XML。将组件注册为ChangeListener的最简单方法是:
@Component(name="...")
@Service
public class MyComponent implements ChangeListener {
@Override public void changeOccurred(...) {
// ...
}
// ...
}
这是一种关系,它将我的组件暴露给任何要求它的人。相反,我想要一个has-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();
}
// ...
}
有没有更好的方法来实现包含的侦听器,它不是那么冗长但仍能实现内部类的信息隐藏?