1

私の 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();
    }
    // ...
}

それほど冗長ではないが、内部クラスの情報隠蔽を実現する、含まれているリスナーを実装するより良い方法はありますか?

4

0 に答える 0