j中的回调是什么

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

我已经阅读了维基百科上关于回调的定义,但是我仍然没有理解。 谁能解释一下什么是回调,尤其是以下几行

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

Jack welch asked 2020-01-14T13:35:15Z
6个解决方案
148 votes

回叫很容易用电话系统来描述。 功能呼叫类似于打电话给某人,问一个问题,得到答案并挂断电话。 添加回叫会改变类比,以便在问了她一个问题之后,还给了她您的姓名和电话号码,以便她可以给您回覆答案。

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

DejanLekic answered 2020-01-14T13:36:06Z
54 votes

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

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

Martin James answered 2020-01-14T13:35:42Z
24 votes

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

在Java中,一个明显的示例是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);
}
gpeche answered 2020-01-14T13:36:36Z
13 votes

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

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

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

Dan Hardiker answered 2020-01-14T13:37:05Z
13 votes

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

但是,这一切都很好,而且很好,我们经常谈到回调对象和回调接口,并且当该对象或接口中只有一个方法时,我们甚至可能谈到回调方法或回调函数。 我们人类倾向于在不准确的交流中蓬勃发展。

(实际上,也许最好的方法是只说“回调”而不添加任何限定条件:这样,就不会出错。  参见下一句。)

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

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

Mike Nakis answered 2020-01-14T13:37:45Z
7 votes

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

尽管回调也用于将传递方法模拟为参数,就像在函数式编程语言中一样。

n0rm1e answered 2020-01-14T13:38:09Z
translate from https://stackoverflow.com:/questions/8736378/what-is-a-callback-in-java