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

}

时间: 2024-11-01 19:20:56

用 Java 接口实现回调函数的等价功能的相关文章

怎样理解java中的回调函数

问题描述 最近遇到回调函数问题,有点不太理解,到底什么是回调函数,有何用途,与命令模式是不是有点关系! 解决方案 是可以这样说的·这个在spring中尤其明显,比如spring中的运用到的AOP2.0以后的框架,在spring配置文件中引入aop2.0以后的命名空间后可以这样配置:<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.or

Android编程之匿名内部类与回调函数用法分析_Android

本文实例讲述了Android编程之匿名内部类与回调函数用法.分享给大家供大家参考,具体如下: 我们Android开发中经常用到一些匿名内部类,及其其中的回调函数,例如,我们给Button设置监听器时候通常要实现OnCLickListener接口,并重写其中的Onclick()方法,这就是匿名内部类与回调函数,那么你对Java匿名内部类以及回调函数又理解多少呢?这篇文档给予比较详细的解释. 首先应该知道,内部类是JAVA语言的主要附加部分.内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同

Android编程之匿名内部类与回调函数用法分析

本文实例讲述了Android编程之匿名内部类与回调函数用法.分享给大家供大家参考,具体如下: 我们Android开发中经常用到一些匿名内部类,及其其中的回调函数,例如,我们给Button设置监听器时候通常要实现OnCLickListener接口,并重写其中的Onclick()方法,这就是匿名内部类与回调函数,那么你对Java匿名内部类以及回调函数又理解多少呢?这篇文档给予比较详细的解释. 首先应该知道,内部类是JAVA语言的主要附加部分.内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同

手把手教你写回调函数

                                        手把手教你写回调函数       手把手教你写回调函数源代码   回调函数的主要功能就是提供统一的接口以及事件的通知.如果你是从事middleware,框架,提供API编程的,那么你肯定少不了要使用回调函数. 所谓提供统一接口或者事件的通知即:当发生某一事件或者出现某一个状态之后必定会进行某种操作.但是这个操作又不能写死,不同的环境不同的程序会有不同的实现,也就是说提供接口的人不想把逻辑写死,而是由调用接口的人来实现

Java中利用接口实现回调

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

java回调函数

    在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就称为回调.     在Java里面,我们使用接口来实现回调.     所谓的回调,就是程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法.下面是例子.       1.  首先定义一个类Caller,按照上面的定义就是程序员A写的程序a,这

再谈java回调函数_java

又遇到了回调函数,这次打算写下来分享一下. 所谓回调函数,或者在面向对象语言里叫回调方法,简单点讲,就是回头在某个时间(事件发生)被调用的函数. 再详细点:就是一个函数A,作为参数,传入了另一个函数B,然后被B在某个时间调用. 这里可以有疑问了,既然是一个函数调用另一个函数,可以在函数体里面调用啊,为什么还要把函数作为参数传到另一个函数里被调用?何况还有一些语言(比如java)不支持把函数作为参数. 对的,确实可以在函数体里调用另一个函数,功能上好像是没差别的,但是这里有一个问题,就是你要调用的

请问 java 接口有什么好处?如果只是说在函数调用时,入参更方便的话,为什么不考虑用泛型?

问题描述 请问 java 接口有什么好处?如果只是说在函数调用时,入参更方便的话,为什么不考虑用泛型? 请问 java 接口有什么好处?如果只是说在函数调用时,入参更方便的话,为什么不考虑用泛型? 解决方案 记住一点,继承表示 是什么,接口表示 能做什么,就好像一个点击动作的接口,它跟被点击对象没有任何关系,所以只是实现做什么 解决方案二: 接口入参方便??我真没感觉出来. 接口具体作用对不同人来说都不同的. 如果你是一个码农: 可能好处就是说更换实现类更容易了吧. 例如你现在项目用的是mysq

boost python c++接口-boost python 封装c++接口 回调函数设置类对象

问题描述 boost python 封装c++接口 回调函数设置类对象 在python调用的时候报错,应该是self不是c++的类型导致无法使用 解决方案 最好是再封装一层C的接口给Python调用