什么是java中的回调

What is a callback in java

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is a callback function?

我读过维基百科对回调的定义,但我还是没有理解。有人能告诉我什么叫回拨吗,尤其是下面这句话

In computer programming, a callback is a reference to executable code, or a piece of executable code, that is passed as an argument to other code. This allows a lower-level software layer to call a subroutine (or function) defined in a higher-level layer.


Callbacks are most easily described in terms of the telephone system. A function call is analogous to calling someone on a telephone, asking her a question, getting an answer, and hanging up; adding a callback changes the analogy so that after asking her a question, you also give her your name and number so she can call you back with the answer.

Paul Jakubik, Callback Implementations in C++.


也许举个例子会有帮助。

您的应用程序希望从某台远程计算机下载一个文件,然后写入本地磁盘。远程计算机是拨号调制解调器和卫星链路的另一侧。延迟和传输时间将非常长,您还有其他事情要做。所以,您有一个函数/方法可以将缓冲区写入磁盘。将指向此方法的指针以及远程URI和其他内容传递到网络API。这个网络呼叫"立即"返回,您可以做其他事情。30秒后,来自远程计算机的第一个缓冲区到达网络层。然后,网络层调用在设置过程中传递的函数,因此缓冲区被写入磁盘-网络层"回调"。请注意,在本例中,回调将发生在网络层线程上,而不是起始线程上,但这并不重要-缓冲区仍然被写入磁盘。


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

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

例子:

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
32
33
34
35
36
37
38
39
40
41
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);
}


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

在爪哇中,通常可以通过实现接口并传递实现它的对象(或匿名内部类)来完成。您经常在事务和线程中发现这一点,例如FuturesAPI。

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


严格来说,在Java中不存在EDCOX1 0的概念,因为在Java中没有函数,只有方法,并且不能通过方法,只能传递对象和接口。因此,任何引用该对象或接口的人都可以调用它的任何方法,而不仅仅是您希望它们调用的一个方法。

然而,这一切都很好,我们经常提到回调对象和回调接口,当对象或接口中只有一个方法时,我们甚至可能提到回调方法甚至回调函数;我们人类往往在不准确的通信中兴旺发达。

(事实上,最好的方法也许就是不加任何限制地谈论"回调":这样,你就不可能出错。见下一句。)

在Java中使用回调的一个最著名的例子是当您调用EDCOX1×1对象来对其进行排序时,您提供了一个比较器,该比较器知道如何比较列表中包含的对象。

您的代码是高级层,它调用下层层(标准Java运行时列表对象),为其提供一个接口,该对象位于您的(高级)层中。然后列表将"回调"您的对象来完成它不知道如何做的部分工作,即比较列表中的元素。因此,在这个场景中,比较器可以被看作是一个回调对象。


在爪哇中,回调方法主要用于解决与"异步编程"密切相关的"观察者模式"。

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