什么是java中的回调

时间:2012-01-05 01:11:42

标签: java

  

可能重复:
  What is a callback function?

我已经阅读了维基百科的回调定义,但我仍然没有得到它。任何人都可以解释一下回调是什么,特别是以下一行

  

在计算机编程中,回调是对可执行代码或一段可执行代码的引用,它作为参数传递给其他代码。这允许较低级别的软件层调用更高级别层中定义的子例程(或函数)。

6 个答案:

答案 0 :(得分:148)

  

回调最容易用电话系统来描述。功能调用类似于通过电话呼叫某人,向她询问问题,获得答案以及挂断电话;添加一个回调会改变这个类比,这样在问她一个问题之后,你还会告诉她你的姓名和号码,这样她就可以给你回答答案。

     

Paul Jakubik, C ++中的回调实现。

答案 1 :(得分:54)

也许一个例子会有所帮助。

您的应用想从某个远程计算机下载文件,然后写入本地磁盘。远程计算机是拨号调制解调器和卫星链路的另一端。延迟和传输时间将是巨大的,您还有其他事情要做。所以,你有一个函数/方法将缓冲区写入磁盘。您将指向此方法的指针与远程URI和其他内容一起传递给您的网络API。此网络呼叫会立即返回,您可以执行其他操作。 30秒后,来自远程计算机的第一个缓冲区到达网络层。然后,网络层调用您在设置期间传递的函数,因此缓冲区将写入磁盘 - 网络层已“回调”。请注意,在此示例中,回调将发生在网络层线程而不是原始线程上,但这无关紧要 - 缓冲区仍会写入磁盘。

答案 2 :(得分:24)

回调是您传递给给定方法的一些代码,因此可以在以后调用它。

在Java中,一个明显的例子是java.util.Comparator。您通常不直接使用Comparator;相反,你将它传递给一些稍后调用Comparator的代码:

示例:

class CodedString implements Comparable<CodedString> {
    private int code;
    private String text;

    ...

    @Override
    public boolean equals() {
        // member-wise equality
    }

    @Override
    public int hashCode() {
        // member-wise equality 
    }

    @Override
    public boolean compareTo(CodedString cs) {
        // Compare using "code" first, then
        // "text" if both codes are equal.
    }
}

...

public void sortCodedStringsByText(List<CodedString> codedStrings) {
    Comparator<CodedString> comparatorByText = new Comparator<CodedString>() {
        @Override
        public int compare(CodedString cs1, CodedString cs2) {
            // Compare cs1 and cs2 using just the "text" field
        }
    }

    // Here we pass the comparatorByText callback to Collections.sort(...)
    // Collections.sort(...) will then call this callback whenever it
    // needs to compare two items from the list being sorted.
    // As a result, we will get the list sorted by just the "text" field.
    // If we do not pass a callback, Collections.sort will use the default
    // comparison for the class (first by "code", then by "text").
    Collections.sort(codedStrings, comparatorByText);
}

答案 3 :(得分:13)

回调通常用于异步编程,因此您可以创建一个处理来自Web服务的响应的方法。当您调用Web服务时,您可以将方法传递给它,这样当Web服务响应时,它会调用您告诉它的方法......它“回调”。

在Java中,这通常可以通过实现接口并传递实现它的对象(或匿名内部类)来完成。您经常会在交易和线程中找到它 - 例如Futures API。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Future.html

答案 4 :(得分:12)

严格地说,Java中不存在callback function的概念,因为在Java中没有函数,只有方法,并且你不能传递方法,你只能传递对象和接口。因此,无论谁引用该对象或接口,都可以调用其方法的 任何 ,而不仅仅是您希望它们使用的一种方法。

然而,这一切都很好,我们经常谈论回调对象和回调接口,当该对象或接口中只有一个方法时,我们甚至可以说回调方法甚至回调函数;我们人类倾向于在不准确的沟通中茁壮成长。

(实际上,也许最好的方法就是在不增加任何资格的情况下谈论“回调”:这样,你就不会出错。  见下一句。)

在Java中使用回调的最着名的例子之一是当你调用ArrayList对象进行自我排序时,你提供了一个比较器,它知道如何比较包含的对象在列表中。

您的代码是高级层,它调用较低级别的层(标准Java运行时列表对象),为其提供与(高级)层中对象的接口。然后该列表将“回调”您的对象以执行其不知道如何操作的部分工作,即比较列表的元素。因此,在这种情况下,比较器可以被认为是一个回调对象。

答案 5 :(得分:6)

在Java中,回调方法主要用于解决&#34; Observer Pattern&#34;,它与&#34;异步编程&#34;密切相关。

虽然回调也用于模拟传递方法作为参数,就像在函数式编程语言中所做的那样。