用Java接口实现回调函数的等价功能
用Java接口实现回调函数的等价功能
首先,看一下回调函数的定义及起源:
简而言之,回调函数就是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说是回调函数。
为什么要使用回调函数?
因为可以把调用者与被调用者分开。调用者不关心被调用者,所有它需要知道的,只是存在一个具有某种特定原型,某些限制条件(如返回值为int)的调用函数。
如果想知道回调函数在实际中有什么作用,先假设有一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序、快速排序、shell排序、shake排序等等,但为了使库更加通用,不想再函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种数据类型(int, float, string),此时,该怎么办呢?可以使用函数指针,并进行回调。回调可用于通信机制,例如,有时要在程序中设置一个计时器,每到一定时间,程序会得到相应的通知,但通知机制的实现者对我们的程序一无所知,而此时,就需有一个特定原型的函数指针,用这个指针来进行回调,来通知我们的程序事件已经发生。
在Java支持方法指针之前,Java接口不能提供一种实现回调函数的好方法。熟悉MS-Windows和X Window System事件驱动编程模型的开发人员,习惯于传递在某种事件发生时调用(即 “回调”)的函数指针,Java的面向对象模型目前并不支持方法指针。
Java的接口支持提供一种获得回调的等价功能的机制。其技巧就是:定义一个简单接口,并在该接口中声明我们要调用的方法。
例如:假定我们希望在某个事件发生时得到通知。我们可以定义一个接口:
public interface InterestingEvent {
// 这仅是一个常规方法。因此如果需要,
// 它可以有返回值,也可接收参数
public void interestingEvent();
}
这使得我们可以控制实现该接口类的任何对象。因此,我们不必关心任何外部类型的信息。
public class EventNotifer {
private InterestingEvent ie;
private boolean somethingHappened
public EventNotifer(InterestingEvent event) {
相关文档:
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.meth ......
public class MultiThread {
public static void main(String[] args) {
ProductStack box = new ProductStack("box");
Producer p1 = new Producer(box, "p1");
Producer p2 = new Producer(box, "p2");
Producer p3 = new Producer(box, "p3");
&nb ......
1.Java学习网站:
Java中文世界论坛 http://www.chinajavaworld.com/index.jspa
Java世纪网 http://www.java2000.net/
Java 中文站 http://www.java-cn.com/
Java学习室 ......
Hibernate在Spring配dataSource
S2SH整合 2008-09-12 15:25 阅读160 评论0
字号: 大大 中中 小小
<!-- mysql数据源的配置 -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource ......