`
guojianhui0906
  • 浏览: 46141 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java接口实现回调的功能

    博客分类:
  • 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 (){
// 噢!必定发生了感兴趣的事件!
// 执行某些操作 ...
}

//...
}


这就是所要做的全部工作。我希望这个简单的 Java 习惯用法会使您更有信心地转向 Java。
分享到:
评论

相关推荐

    java实现企业微信回调配置案例

    java实现--企业微信回调配置案例及工具代码

    Java利用接口实现回调

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

    Java中的接口回调

     接口回调会方便功能的扩展,在主功能外由框架层实现定制功能处理。  现在有两个类,一个是A,一个是B,回调是A去调用B中的某个方法,然后B又回调A中的某个方法,这个方法是回调方法,回调的机制是与接口分不开...

    springboot对接微信小程序支付以及回调详细代码

    springboot对接微信小程序支付以及回调详细代码 非常详细,完整流程代码 拿走不谢 亲测可用

    微信公众平台 JAVA开发代码(实现菜单,自动回复,关注事件等)

    微信公众平台,开发者模式下的Java实现。实现菜单,自动回复,关注事件等!利用SpringMVC框架实现。如有疑问,可以关注我的博客~

    大华摄像机实时监控调用java

    展示Java桌面程序,不支持浏览器调用;供参阅。运行General_NetSDKDemo_Chn_Java_Win64_IS_V1.00.31153.T.171212\JNADemo\src\com\netsdk\demo\example\Preview.java(改过ip端口用户名密码后运行main方法)

    理解Android中Activity的方法回调

    在JAVA中回调是通过接口来实现的。作为一种系统架构,必须要有自己的运行环境,并且要提供用户的实现接口。 下面通过实例来模拟一下Android中Activity的方法回调思想。 Activity接口 代码如下: package ...

    设计模式Callback介绍与实例

    >他的调用时机由工作流决定,回调函数的实现者不能直接调用回调函数来实现工作流的功能; 回调机制 回调机制是一种常见的设计模型,他把工作流内的某个功能,按照约定的接口暴露给外部使用者,为外部使用者提供数据...

    Kotlin 使用高阶函数实现回调方式

    之前学习了 lambda 和高阶函数,然后在 android 开发中对 onClick 事件进行监听是一个很常用的功能,kotlin 的常规实现如下: rootView.setOnClickListener { view -> println(点击了这个ID=${view.id}的view) }...

    Java开发技术大全(500个源代码).

    hasRecall.java 可以完成回调功能的类 HasStatic.java 一个简单的拥有静态成员的类 hideMember_1.java 成员隐藏示例1 hideMember_2.java 成员隐藏示例2 hideMember_3.java 成员隐藏示例3 hideMember_4.java ...

    微信小程序 支付后台java实现实例

    主要介绍了微信小程序 支付后台java实现实例的相关资料,需要的朋友可以参考下

    实现易宝支付

    java代码中的一个实现易宝支付的servlet,通过第三方支付接口易宝来实现支付功能

    基于SpringBoot实现微信扫码支付功能源码+数据库+项目说明.zip

    当用户下单成功后,微信异步回调商户接口的时候,通过ngrok工具就可以回调到本地,方便本地调试。 【备注】 主要针对计算机相关专业的正在做毕设的学生和需要项目实战的Java学习者。 也可作为课程设计、期末大作业。...

    海康iSC平台测试第三方对接接收事件工具

    实时事件对接是通过回调第三方的 http 接口推送事件的,在与第三方对接中 为了方便验证 esc 是否正常回调第三方接口推送事件,我这边开发了一个建议程序,用来监 听一个 http 接口,用来测试事件推送功能。

    java 微信支付

    此代码为java开发微信支付,根据微信的支付接口进行开发,并含有支付成功后的回调方法。

    疯狂JAVA讲义

    6.7.6 闭包(Closure)和回调 215 6.8 枚举类 217 6.8.1 手动实现枚举类 217 6.8.2 枚举类入门 219 6.8.3 枚举类的属性、方法和构造器 220 6.8.4 实现接口的枚举类 223 6.8.5 包含抽象方法的枚举类 224 6.9 ...

    java 实现AOP

    一般来说要截获一个方法,我们可以采用回调方法或者动态代理。动态代理一般要更加灵活一些,目前多数的AOP Framework也大都采用了动态代理来实现。这里我们也采用动态代理作为例子。  JDK1.2以后提供了动态代理的...

    Android录制小视频VideoRecord按住按钮录视频.rar

    这个功能是模仿微信中的按信按钮录制小视频的功能,预设为10秒,这个自己可以设置,如... MovieRecorderView.java为小视频录制的主文件,实现各种录制参数的预设、录制完成回调接口、初始化摄像头、设置竖屏等功能。

    Android仿微信长按录制小视频功能.rar

    这里主要是说实现这一功能需要用到的一些方法,比如视频播放控件的调用和定义、计时器的使用、使用摄像头、初始化摄像头(横屏和竖屏的切换)、设置进度条、视频录制的控制(开始录制、停止录制等)、录制完成回调...

    java 面试题 总结

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

Global site tag (gtag.js) - Google Analytics