Java中利用接口实现回调

在 Java 支持方法指针之前,Java 接口不能提供一种实现回调的好方法。如果您习惯于传递在事件驱动编 程模型中调用的函数指针,则您会喜欢本技巧。
熟悉 MS-Windows 和 X Window System 事件驱动编程 模型的开发人员,习惯于传递在某种事件发生时调用(即“回调”)的函数指针。Java 的面向对象模型目前 并不支持方法指针,这样似乎就不可能使用这种很好的机制。但我们并不是一点办法都没有!

Java 的接 口支持提供了一种获得回调的等价功能的机制。其技巧就是:定义一个简单接口,并在该接口中声明我们要调 用的方法。

例如,假定我们希望在某个事件发生时得到通知。我们可以定义一个接口:

public interface InterestingEvent{
// 这仅是一个常规方法。因此如果需要,
// 它可有返回值,也可接收参数。
public void interestingEvent ();
}

这使得我们可以控制实现该接口的类的任何对象。因此,我们不必关心任何外部类型信息。与在将 C++ 代码用于 Motif 时使用窗口小部件的数据域来容纳对象指针的难以控制的 C 函数相比,这种方法要好得 多。

发出事件信号的类必须等待实现了 InterestingEvent 接口的对象,并在适当时候调用 interestingEvent() 方法。

public class EventNotifier{
private InterestingEvent ie;
private boolean somethingHappened;   

public EventNotifier (InterestingEvent event){
// 保存事件对象以备后用。
ie = event;   

// 还没有要报告的事件。
somethingHappened = false;
}   

//...   

public void doWork (){
// 检查在别处设置的谓词。
if (somethingHappened){
// 通过调用接口的这个方法发出事件信号。
ie.interestingEvent ();
}
//...
}   

// ...
}

在上例中,我使用 somethingHappened 谓词来跟踪是否应触发事件。在许多情况下,调用此方法 足以保证向 interestingEvent() 发出信号。

希望接收事件通知的代码必须实现 InterestingEvent 接口,并将自身引用传递给事件通知程序。

public class CallMe implements InterestingEvent{
private EventNotifier en;   

public CallMe (){
// 创建事件通知程序,并将自身引用传递给它。
en = new EventNotifier (this);
}   

// 为事件定义实际的处理程序。
public void interestingEvent (){
// 噢!必定发生了感兴趣的事件!
// 执行某些操作 ...
}   

//...
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索指针
, 接口
, 方法
, 事件传递
, 事件
, 接口回调
, public
, 回调接口
, java回调机制
, java回调机制过程
, java信号量
, java中的回调机制
, java的回调机制
java回调机制详解
java接口回调、java微信支付回调接口、java接口回调详解、java 回调函数实现、java回调接口怎么写,以便于您获取更多的相关知识。

时间: 2024-12-27 00:11:06

Java中利用接口实现回调的相关文章

第三方dll文件-Java中利用jawin调用dll文件,invoke的参数问题

问题描述 Java中利用jawin调用dll文件,invoke的参数问题 各位大神: dll中的被调用方法如下: long WINAPI AutoOpenComPort(long* Port, unsigned char *ComAdr, unsigned char Baud,long *FrmHandle); 其中: Port:输出变量, ComAdr:输入/输出变量 Baud:输入变量 FrmHandle:输出变量 请问它的 msgBox.invoke(instructions, stack

有关java中的 接口 没有new 就可以赋值?

问题描述 有关java中的 接口 没有new 就可以赋值? 就是private Ishape=shape://Ishape为接口public shapeProc(Ishape shape){this.shape=shape:}//shapeProc 为构造函数 这为什么可以编译通过呢?小白,求指导 解决方案 shape是传进来的参数,自然是调用它的代码负责初始化.肯定有这样的代码:某实现了ISharp的类 shape = new 某实现了ISharp的类();xxx.shapeProc(shar

java序列化接口-java中序列化接口和parclable接口有什么区别和联系

问题描述 java中序列化接口和parclable接口有什么区别和联系 java中序列化接口和parclable接口有什么区别和联系 数据是存储到手机本地还是网络服务器啊 解决方案 Android中实现序列化有两个选择:一是实现Serializable接口(是JavaSE本身就支持的),一是实现Parcelable接口(是Android特有功能,效率比实现Serializable接口高效,可用于Intent数据传递,也可以用于进程间通信(IPC)).实现Serializable接口非常简单,声明

Java中利用散列表实现股票行情的查询(转)

Java中利用散列表实现股票行情的查询 建设银行云南省保山地区分行 杨绍方 ---- 在java中,提供了一个散列表类Hashtable,利用该类,我们可以按照特定的方式来存储数据,从而达到快速检索的目的.本文以查询股票的收盘数据为例,详细地说明java中散列表的使用方法.一.散列表的原理 ---- 散列表,又称为哈希表,是线性表中一种重要的存储方式和检索方法.在散列表中,可以对节点进行快速检索.散列表算法的基本思想是:由结点的关键码值决定结点的存储地址,即以关键码值k为自变量,通过一定的函数关

Java中Cloneable接口

原文地址:Java中Cloneable接口作者:我有一个梦 目录 预备知识 为什么要clone Object的clone以及为什么如此实现 如何clone 对clone的态度 其他的选择 和Serializable的比较 性能 预备知识 为了理解java的clone,有必要先温习以下的知识. java的类型,java的类型分为两大类,一类为primitive,如int,另一类为引用类型,如String,Object等等. java引用类型的存储,java的引用类型都是存储在堆上的. Java代码

java中利用反射调用另一类的private方法的简单实例_java

我们知道,Java应用程序不能访问持久化类的private方法,但Hibernate没有这个限制,它能够访问各种级别的方法,如private, default, protected, public. Hibernate是如何实现该功能的呢?答案是利用JAVA的反射机制,如下:  import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class ReflectDemo

Java中Executor接口用法总结_java

本文实例讲述了Java中Executor接口用法.分享给大家供大家参考.具体如下: 1.Java中Executor接口的定义 public interface Executor { void execute(Runnable command); } 2.Executors以下静态工厂方法创建一个线程池: a) newFixedThreadPool:创建一个定长的线程池.达到最大线程数后,线程数不再增长. 如果一个线程由于非预期Exception而结束,线程池会补充一个新的线程. b) newCa

java中的接口与实现

我们通常认为访问控制是"隐藏实施细节"的一种方式.将数据和方法封装到类内后,可生成一种数据类型,它具有自己的特征与行为.但由于两方面重要的原因,访问为那个数据类型加上了自己的边界.第一个原因是规定客户程序员哪些能够使用,哪些不能.我们可在结构里构建自己的内部机制,不用担心客户程序员将其当作接口的一部分,从而自由地使用或者"滥用". 这个原因直接导致了第二个原因:我们需要将接口同实施细节分离开.若结构在一系列程序中使用,但用户除了将消息发给public接口之外,不能做

java中set接口使用方法详解_java

java中的set接口有如下的特点: 不允许出现重复元素: 集合中的元素位置无顺序: 有且只有一个值为null的元素. 因为java中的set接口模仿了数学上的set抽象,所以,对应的数学上set的特性为: 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次.无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的.集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序.但就集合本身的特性而言,元素之间没有必然的序.空集的性质:空集是一切集合的子集