14

インターフェイス SetObserver のこのコード スニペットは、Effective Java (Avoid Excessive Synchronization Item 67)から取得したものです。

public interface SetObserver<E> {
// Invoked when an element is added to the observable set
void added(ObservableSet<E> set, E element);
}

そして、以下に示すようにandメソッドにSetObserver渡されます。addObserver()removeObserver

// Broken - invokes alien method from synchronized block!
public class ObservableSet<E> extends ForwardingSet<E> {
  public ObservableSet(Set<E> set) {
    super(set);
  }

  private final List<SetObserver<E>> observers =
      new ArrayList<SetObserver<E>>();

  public void addObserver(SetObserver<E> observer) {
    synchronized (observers) {
      observers.add(observer);
    }
  }



  public boolean removeObserver(SetObserver<E> observer) {
    synchronized (observers) {
      return observers.remove(observer);
    }
  }



  private void notifyElementAdded(E element) {
    synchronized (observers) {
      for (SetObserver<E> observer : observers)
        observer.added(this, element);
    }
  }

Bloch は、こ​​のSetObserver<E>インターフェイスをコールバック インターフェイスと呼んでいます。Javaでコールバックインターフェースと呼ばれるインターフェースはいつですか?

4

1 に答える 1

19

インターフェイスが「コールバック インターフェイス」になるための一般的な要件は、呼び出し先が呼び出し元内のコードを呼び出す方法をインターフェイスが提供することです。主なアイデアは、別のコンポーネントのコードで何かが発生したときに実行する必要があるコードを呼び出し元が持っているということです。コールバック インターフェイスは、このコードを呼び出されるコンポーネントに渡す方法を提供します。呼び出し元はインターフェイスを実装し、呼び出し先はそのメソッドの 1 つを呼び出します。

コールバック メカニズムは言語によって異なる方法で実装される場合があります。C# にはコールバック インターフェイスに加えてデリゲートとイベントがあり、C にはポインターによって渡すことができる関数があり、Objective C にはデリゲート プロトコルがあります。しかし、主な考え方は常に同じです。呼び出し元は、特定のイベントの発生時に呼び出されるコードの一部を渡します。

于 2012-07-20T10:46:36.523 に答える