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中,一个明显的例子是
例子:
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运行时列表对象),为其提供一个接口,该对象位于您的(高级)层中。然后列表将"回调"您的对象来完成它不知道如何做的部分工作,即比较列表中的元素。因此,在这个场景中,比较器可以被看作是一个回调对象。
在爪哇中,回调方法主要用于解决与"异步编程"密切相关的"观察者模式"。
尽管回调也被用来模拟作为参数的传递方法,就像在函数式编程语言中所做的那样。