问题 什么是Java中的回调接口?


接口SetObserver的代码片段取自 有效的Java(避免过度同步项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);
    }
  }

布洛赫指的是 SetObserver<E> 接口作为 回叫接口 。什么是Java中称为回调接口的接口?


7857
2017-07-20 10:40


起源

可能重复 什么是回调函数? - assylias
ObservableSet<E> 不是界面,我想你的意思是 SetObserver<E> - Alonso Dominguez
@AlonsoDominguez是的,这是一个错字。现在编辑问题。 - Geek
@Geek Callback是计算机科学中非常通用的术语。当一段代码对事件感兴趣时,它会在事件发生时注册要调用的函数,以便这段代码可以执行所需的操作。它不是特定于javascript。在C / C ++中有函数指针,在C#中有委托,在Java中我们使用接口。 - Ozair Kafray
接口可用于实现 回调 在Java中。一个 回电话 是一种你想通过的情况 参考 某些行为,并让另一个对象稍后调用它。在C或C ++中,这是函数指针的主要区域。在Java中,我们使用 接口 代替。 - Lion


答案:


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

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


13
2017-07-20 10:46



我可能错了,但在Java的情况下,说被调用者实现接口以便调用者可以回调它而不是相反的方式是不正确的?对不起,我知道这个答案差不多是3岁了。 - stevenelberger
@stevenelberger我认为当前的描述是正确的:调用者实现了一个接口,将该实现提供给被调用者,并且被调用者根据需要调用实现的方法。 - dasblinkenlight


本博客通过示例更好地解释了java中的回调接口


1
2018-01-04 09:44



在没有回答任何内容的情况下附加博客链接是个坏主意,这个博客可能会消失,你的回答将无效。 - MariuszS