什么是java中的回调

Jac*_*lch 52 java

可能重复:
什么是回调函数?

我已经阅读了wikipedia对回调的定义,但我仍然没有得到它.谁能解释一下回调是什么,特别是以下几行

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

Dej*_*kic 148

根据电话系统最容易描述回叫.功能调用类似于通过电话呼叫某人,向她询问问题,获得答案以及挂断电话; 添加回调更改了类比,以便在向她询问问题后,您还会告诉她您的姓名和号码,以便她可以给您回复答案.

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


Mar*_*mes 54

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

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

  • @RafaelDiaz.这里的要点是网络功能不能(或不应该)在您获得数据时本身知道/关心您想要对该数据做什么.因此,无需在编译时指定应对数据执行的操作,而是在运行时指定数据何时可用时需要执行的操作.如果您不想回调,如果您希望"调用者"确定应该对数据执行的操作,那么您唯一的选择就是坐下来等待数据,然后在调用函数中自行完成. (5认同)

gpe*_*che 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);
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*ker 13

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

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

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


Mik*_*kis 13

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

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

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

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

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

  • 除非你在Java 8中计算lambda ...然后我们有函数引用! (3认同)

n0r*_*m1e 7

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

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