私の OSGi アプリケーションは、ホワイトボード パターンを使用して、特定の状態変化のリスナーを登録します。宣言型 XML を手作業でコーディングする代わりに、org.apache.felix.scr.annotations を使用してサービスとコンポーネントを宣言します。コンポーネントを ChangeListener として登録する最も簡単な方法は次のとおりです。
@Component(name="...")
@Service
public class MyComponent implements ChangeListener {
@Override public void changeOccurred(...) {
// ...
}
// ...
}
これは is-a 関係であり、私のコンポーネントを要求した人に公開します。代わりに、内部クラスを介して ChangeListener を登録する has-a 関係が必要です。しかし、以下は上記と比較すると非常に醜いです。
@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();
}
// ...
}
それほど冗長ではないが、内部クラスの情報隠蔽を実現する、含まれているリスナーを実装するより良い方法はありますか?