3

ジェネリックコールバックメカニズムとして使用できる好ましいJavaインターフェースまたは同様のパターンは何でしょうか?

たとえば、次のようになります

public interface GenericCallback
{
    public String getID();
    public void callback(Object notification);
    // or public void callback(String id, Object notification);
}

hashCode()IDは、呼び出し先が呼び出し元を識別するためにオーバーライドされたメソッドの場合に必要になります。

上記のようなパターンは、条件(処理の終了など)から生成されたクラスにレポートを返す必要があるオブジェクトに役立ちます。

このシナリオでは、「親」クラスはgetID()これらの各オブジェクトのメソッドを使用して、GenericCallbackオブジェクトを追跡し、Map<String, GenericCallable>受信した通知に従ってオブジェクトを追加または削除します。

また、そのようなインターフェイスには実際にどのような名前を付ける必要がありますか?

多くの人がJavaObserverパターンを好むようですが、そこで定義されたObservableクラスは、単一の継承を回避するためのインターフェースではなく、上記の単純なシナリオで実際に必要とされるよりも多くの機能を備えているため、便利ではありません。

4

3 に答える 3

24

渡されたオブジェクトのタイプに基づいて、コールバックを一般化します。これは、さまざまなクラスのイベントをリッスンする EventListener に特に役立ちます。例えば

public interface Callback<T> {
   public void callback(T t);
}

タイプ T を Map のキーとして使用できる場合があります。もちろん、String のように同じ引数を取る 2 つのコールバックを区別したい場合は、getID().

これをイベント リスナーに使用することについての私の古いブログはこちら インターフェースEvents.Listenerは上記に対応しCallback<T>ます。また、ブロードキャスターは Map を使用して、引数として受け入れるクラスに基づいて複数のリスナーを追跡します。

于 2013-03-07T00:36:58.847 に答える
4

オブザーバーパターンはデカップリングのゴールドスタンダードであるため、オブザーバーパターンを使用することをお勧めします。つまり、相互に依存するオブジェクトの分離です。

ただし、一般的なコールバックメカニズムを探している場合は、 Java.util.Observableクラスの使用を避けることをお勧めします。Observableにはいくつかの弱点があるためです。それはインターフェースではなく、イベントを表すためにObjectを使用することを強制します。

次のように独自のイベントリスナーを定義できます。

public class MyEvent extends EventObject {
    public MyEvent(Object source) {
        super(source);
    }
}

public interface MyEventListener {
    void handleEvent(EventObject event);
}

public class MyEventSource {
    private final List<MyEventListener> listeners;
    public MyEventSource() {
        listeners = new CopyOnWriteArrayList<MyEventListener>();
    }
    public void addMyEventListener(MyEventListener listener) {
        listeners.add(listener);
    }
    public void removeMyEventListener(MyEventListener listener) {
        listeners.remove(listener);
    }
    void fireEvent() {
        MyEvent event = new MyEvent(this);
        for (MyEventListener listener : listeners) {
            listener.handleEvent(event);
        }
    }
}
于 2013-03-07T00:45:37.833 に答える
1

Observer パターンを実装したいようです。このURLには、Java でのオブザーバー パターンの完全な実装があります。あなたの場合、オブザーバーはコールバックになります。

また、より複雑なものを実装する必要がある場合は、イベント/通知パターンを実行することになります。この他のパタ​​ーンを見てみましょうこちら.

ありがとう、@レオ。

于 2013-03-07T00:10:39.440 に答える