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);
}

并且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

接口成为“回调接口”的一般要求是该接口为被调用者提供了一种调用调用者内部代码的方法。主要思想是调用者有一段代码需要在另一个组件的代码中发生某些事情时执行。回调接口提供了一种将此代码传递给被调用组件的方法:调用者实现一个接口,而被调用者调用其中一个方法。

回调机制在不同语言中的实现方式可能不同:C# 除了回调接口之外还有委托和事件,C 有可以通过指针传递的函数,Objective C 有委托协议等等。但主要思想始终是相同的:调用者传递一段代码以在某个事件发生时被调用。

于 2012-07-20T10:46:36.523 回答