`
xzknet
  • 浏览: 307047 次
  • 性别: Icon_minigender_1
  • 来自: 河南
文章分类
社区版块
存档分类
最新评论

用 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;
  testReCall();
 }

 /**
  * 回调函数
  *
  * @author Ken_xu
  */
 public void testReCall() {
  somethingHappened = true;
  doWork();
 }

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

 // ...
}

 

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

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

public class CallMe implements InterestingEvent {
 private EventNotifier en;

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

 int doNum = 0;

 // 为事件定义实际的处理程序。
 public void interestingEvent() {
  // 噢!必定发生了感受好的事件!
  // 执行某些操作 ...
  System.out.println("doNum=" + doNum++);
 }
 // ...
}


这就是所要做的全部工作。我希望这个简单的 Java 习惯用法会使您更有信心地转向 Java。
这里我补充一个测试函数
public class TestCallMe {

 /**
  * @param args
  * @author Ken_xu
  */
 public static void main(String[] args) {
  CallMe cm = new CallMe();
  System.out.println("====");
 }

}

分享到:
评论

相关推荐

    Java利用接口实现回调

    在Java支持方法指针之前,Java接口不能提供一种实现回调的好方法。如果您习惯于传递在事件驱动编程模型中调用的函数指针,则您会喜欢本技巧。  熟悉MS-Windows和X Window System事件驱动编程模型的开发人员,习惯...

    jna_test.rar_JNA JAVA C_jna_jna 函数

    本示例"jna_test.rar"着重展示了如何使用JNA在Java中调用C函数,以及实现C函数回调Java方法。 首先,理解JNA的工作原理至关重要。JNA的核心在于映射(mapping),它将Java类和方法映射到本地库中的函数和结构。JNA...

    JNA java doc

    6. 高级特性:JNA还包括回调机制,允许Java方法作为本地库的回调函数;以及内存管理功能,如自定义内存分配和释放策略。 在实际开发中,JNA广泛应用于各种场景,如系统调用、硬件访问、图形界面操作等。例如,通过...

    java中的接口能够被实例化吗

    这种方式使得代码更加灵活,可以方便地在运行时指定行为,是实现面向切面编程(AOP)和回调机制的关键技术之一。在实际开发中,我们常常利用接口来定义模块间的交互契约,通过实现这些接口,不同组件之间可以松耦合...

    Thinking in Java 中文第四版+习题答案

    A.3.4 编写回调函数 A.3.5 其他J/Direct特性 A.4 本原接口(RNI) A.4.1 RNI总结 A.5 Java/COM集成 A.5.1 COM基础 A.5.2 MS Java/COM集成 A.5.3 用Java设计COM服务器 A.5.4 用Java设计COM客户 A.5.5 ActiveX/Beans...

    java 编程入门思考

    A.3.4 编写回调函数 A.3.5 其他J/Direct特性 A.4 本原接口(RNI) A.4.1 RNI总结 A.5 Java/COM集成 A.5.1 COM基础 A.5.2 MS Java/COM集成 A.5.3 用Java设计COM服务器 A.5.4 用Java设计COM客户 A.5.5 ActiveX/Beans...

    Java初学者入门教学

    A.3.4 编写回调函数 A.3.5 其他J/Direct特性 A.4 本原接口(RNI) A.4.1 RNI总结 A.5 Java/COM集成 A.5.1 COM基础 A.5.2 MS Java/COM集成 A.5.3 用Java设计COM服务器 A.5.4 用Java设计COM客户 A.5.5 ActiveX/Beans...

    java联想(中文)

    A.3.4 编写回调函数 A.3.5 其他J/Direct特性 A.4 本原接口(RNI) A.4.1 RNI总结 A.5 Java/COM集成 A.5.1 COM基础 A.5.2 MS Java/COM集成 A.5.3 用Java设计COM服务器 A.5.4 用Java设计COM客户 A.5.5 ActiveX/Beans...

    JAVA_Thinking in Java

    A.3.4 编写回调函数 A.3.5 其他J/Direct特性 A.4 本原接口(RNI) A.4.1 RNI总结 A.5 Java/COM集成 A.5.1 COM基础 A.5.2 MS Java/COM集成 A.5.3 用Java设计COM服务器 A.5.4 用Java设计COM客户 A.5.5 ActiveX/Beans...

    Thinking in Java简体中文(全)

    A.3.4 编写回调函数 A.3.5 其他J/Direct特性 A.4 本原接口(RNI) A.4.1 RNI总结 A.5 Java/COM集成 A.5.1 COM基础 A.5.2 MS Java/COM集成 A.5.3 用Java设计COM服务器 A.5.4 用Java设计COM客户 A.5.5 ActiveX/Beans...

    Java语言的26个细节

    5. **匿名内部类**:用于创建一次性使用的类,常用于事件监听器或回调函数。 6. **泛型**:Java 5引入泛型,增强了类型安全,减少运行时类型检查和强制转换。 7. **枚举类型**:比传统的常量定义更安全,支持方法...

    java资料面试题

    ### Java基本概念及环境配置 #### 1.1 什么是面向对象程序设计? 面向对象程序设计(Object-Oriented Programming, OOP)是一种编程范式,它基于“对象”的概念来构建程序。对象是现实世界实体的抽象表示,具有...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    A.3.4 编写回调函数 A.3.5 其他J/Direct特性 A.4 本原接口(RNI) A.4.1 RNI总结 A.5 Java/COM集成 A.5.1 COM基础 A.5.2 MS Java/COM集成 A.5.3 用Java设计COM服务器 A.5.4 用Java设计COM客户 A.5.5 ActiveX/Beans...

    Think in Java(中文版)chm格式

    A.3.4 编写回调函数 A.3.5 其他J/Direct特性 A.4 本原接口(RNI) A.4.1 RNI总结 A.5 Java/COM集成 A.5.1 COM基础 A.5.2 MS Java/COM集成 A.5.3 用Java设计COM服务器 A.5.4 用Java设计COM客户 A.5.5 ...

    C++基础入门教程(九):函数指针之回调

    在C++编程中,函数指针是一个非常重要的概念,它允许我们将函数的地址作为一个值进行传递,从而在程序的不同部分之间实现回调功能。回调是一种设计模式,它允许一个函数或方法在执行过程中调用由其参数提供的其他...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    A.3.4 编写回调函数 A.3.5 其他J/Direct特性 A.4 本原接口(RNI) A.4.1 RNI总结 A.5 Java/COM集成 A.5.1 COM基础 A.5.2 MS Java/COM集成 A.5.3 用Java设计COM服务器 A.5.4 用Java设计COM客户 A.5.5 ActiveX/Beans...

    java软件工程师面试宝典

    - 异步是指调用方发起调用后不必等待方法执行完毕就可以继续执行后续代码,当方法执行完毕时会通过回调、事件等方式通知调用方。 41. **final、finally、finalize的区别** - `final`:用来修饰类、方法或变量,...

    java面试题

    Java中实现多态的机制主要通过继承和接口实现。当一个类继承另一个类时,它可以重写父类的方法,这样在运行时就可以根据实际对象的类型调用相应的方法实现。 #### 24. abstractclass和interface有什么区别? - **...

    Java 面试题

    - 异步:提交任务后立即返回,操作完成后通过回调通知。 - 适用场景取决于是否需要立即获得结果。 #### 49. 方法同步性 - 请提供具体的方法示例以便分析。 #### 50. 多线程实现方法与同步实现方法 - 多线程实现...

    ThinkInJava

    A.3.4 编写回调函数 A.3.5 其他J/Direct特性 A.4 本原接口(RNI) A.4.1 RNI总结 A.5 Java/COM集成 A.5.1 COM基础 A.5.2 MS Java/COM集成 A.5.3 用Java设计COM服务器 A.5.4 用Java设计COM客户 A.5.5 ActiveX/Beans...

Global site tag (gtag.js) - Google Analytics