什么是Java中的回调接口?

What is a call back interface in Java?

接口SETSAVER的这个代码片段是从有效的Java中获取的(避免过多的同步项67)

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

SetObserver传递给addObserver()removeObserver方法,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 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接口称为回调接口。Java中的回调接口是什么时候?


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

回调机制可以用不同的语言实现:C除了回调接口外还有委托和事件,C有可以通过指针传递的函数,目标C有委托协议,等等。但主要的想法总是一样的:调用方传递一段代码,在某个事件发生时调用该代码。


这个博客更好地解释了Java中的回调界面