java里什么是回调_什么是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.

@实际上,在那篇文章中找到的定义是来自维基百科的,这里的操作要求对维基百科的定义进行澄清。所以,也许这不是复制品。

回调通常是作为参数提供的函数。Java中的回调是控制的倒装(笑话)。

语言往往具有不同的回调机制。这不可能是语言不可知论问题的复制品。

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秒后,来自远程计算机的第一个缓冲区到达网络层。然后,网络层调用在设置过程中传递的函数,因此缓冲区被写入磁盘-网络层"回调"。请注意,在本例中,回调将发生在网络层线程上,而不是起始线程上,但这并不重要-缓冲区仍然被写入磁盘。

但是,如果网络函数正常调用writetodisk函数,那么回调有什么好处呢?

拉法迪亚兹。这里的要点是,网络功能不能(或不应该)固有地知道/关心您在获取数据时要如何处理这些数据。因此,您不必指定在编译时应该对数据执行什么操作,而是在运行时指定在数据可用时需要对其执行什么操作。没有回调,如果您希望"调用者"确定应该对数据执行什么操作,那么您唯一的选择就是坐着等待数据,然后在调用者函数中自己执行。

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

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

例子:

class CodedString implements Comparable {

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 codedStrings) {

Comparator comparatorByText = new Comparator() {

@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代码吗?谢谢您。

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

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

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

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

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

除非你在Java 8中计算LAMBDA。然后我们有函数引用!

Java 8中的函数引用只不过是从调用方的角度看函数引用。从接收(和回叫)方,它们看起来像(实际上是)常规接口。

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值