什么是在java中的callback
可能重复:
什么是callback函数?
我已经阅读了回叫的wikepedia定义,但我仍然没有得到它。任何人都可以向我解释什么是callback,特别是“在计算机编程中,callback是对可执行代码的引用,或者可执行代码,作为parameter passing给其他代码,这允许较低级别的软件层调用在较高级别层中定义的子例程(或函数)。
也许一个例子会有所帮助。
您的应用程序要从某个远程计算机下载文件,然后写入本地磁盘。 远程计算机是拨号调制解调器和卫星链路的另一端。 延迟和传输时间将是巨大的,你还有其他的事情要做。 所以,你有一个将缓冲区写入磁盘的函数/方法。 您将指向此方法的指针与远程URI以及其他内容一起传递到您的networkingAPI。 这个networking调用返回“立即”,你可以做你的其他的东西。 30秒后,远程计算机的第一个缓冲区到达networking层。 networking层然后调用你在安装过程中传递的函数,所以缓冲区被写入磁盘 – networking层有“callback”。 请注意,在这个例子中,callback将发生在networking层线程上,而不是发起线程,但是这并不重要 – 缓冲区仍然被写入磁盘。
在电话系统方面,回叫最容易描述。 函数调用类似于在电话上打电话给某个人,问她一个问题,得到一个答案,然后挂断; 添加一个callback改变了这个比喻,所以在问她一个问题之后,你还可以给她你的姓名和电话号码,这样她就可以给你回电话了。
Paul Jakubik, C ++中的callback实现。
callback函数是您传递给给定方法的代码,以便稍后调用它。
在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); }
callback通常用于asynchronous编程,因此您可以创build一个处理来自Web服务的响应的方法。 当您调用Web服务时,您可以将方法传递给Web服务,以便在Web服务响应时调用您告诉的方法…“callback”。
在Java中,通常可以通过实现接口并传递实现它的对象(或匿名内部类)来完成。 您通常会在交易和线程中find这种情况 – 例如Futures API。
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Future.html
callback function
的概念在Java中不存在,因为在Java中没有函数,只有对象的方法。 但是,在某些情况下,您可能会说到callback object
或callback interface
。
例如,当您调用一个ArrayList
对象进行自我sorting时,您提供了一个比较器,该比较器知道如何比较列表中包含的对象,您的代码是高层,它调用底层(标准的Java运行时列表对象)提供一个接口到一个对象在你的(高层次)层。 然后列表将“callback”你的对象来完成不知道该怎么做的那部分工作,即比较列表中的元素。 所以,在这种情况下比较器可以被认为是一个callback对象。
在Java中,callback方法主要用于解决与“asynchronous编程”密切相关的“ 观察者模式 ”。
虽然callback函数也被用来模拟传递方法作为参数,就像函数式编程语言所做的一样。