理解Java当中的回调机制

你好,今天我要和大家分享一些东西,举例来说这个在JavaScript中用的很多。我要讲讲回调(callbacks)。你知道什么时候用,怎么用这个吗?你真的理解了它在java环境中的用法了吗?当我也问我自己这些问题,这也是我开始研究这些的原因。这个背后的思想是控制反转( PS:维基百科的解释是控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。)这个范例描述了框架(framework)的工作方式,也以“好莱坞原则:不要打电话给我们,我们会打给你("Hollywood principle - Don't call me, we will call you)”为人们所熟知。

  简单的Java里的回调模式来理解它,具体的例子在下面:


1 interface CallBack {

2     void methodToCallBack();

3 }

4

5 class CallBackImpl implements CallBack {

6     public void methodToCallBack() {

7         System.out.println("I've been called back");

8     }

9 }

10

11 class Caller {

12

13     public void register(CallBack callback) {

14         callback.methodToCallBack();

15     }

16

17     public static void main(String[] args) {

18         Caller caller = new Caller();

19         CallBack callBack = new CallBackImpl();

20         caller.register(callBack);

21     }

22 }

  你可能要问我,什么时候用这个或者会问直接调用和回调机制有什么不同呢?

  答案是:好吧,这个例子仅仅向你展示了怎样在java环境中构造这样的回调函数。当然用那种方式使用它毫无意义。让我们现在更加深入具体地研究它。

  在它之中的思想是控制反转。让我们用定时器作为现实中的例子。假设你知道,有一个特别的定时器支持每小时回调的功能。准确地说意思是,每小时,定时器会调用你注册的调用方法。

  具体的例子:

  我们想要每小时更新一次网站的时间,下面是例子的UML模型:

  回调接口:

  让我们首先定义回调接口:


1 import java.util.ArrayList;

2 import java.util.List;

3

4 // For example: Let's assume that this interface is offered from your OS to be implemented

5 interface TimeUpdaterCallBack {

6     void updateTime(long time);

7 }

8

9 // this is your implementation.

10 // for example: You want to update your website time every hour

11 class WebSiteTimeUpdaterCallBack implements TimeUpdaterCallBack {

12

13     @Override

14     public void updateTime(long time) {

15         // print the updated time anywhere in your website's example

16         System.out.println(time);

17     }

18 }

在我们的例子中系统定时器支持回调方法:


1 // This is the SystemTimer implemented by your Operating System (OS)

2 // You don't know how this timer was implemented. This example just

3 // show to you how it could looks like. How you could implement a

4 // callback by yourself if you want to.

5 class SystemTimer {

6

7     List<TimeUpdaterCallBack> callbacks = new ArrayList<TimeUpdaterCallBack>();

8

9     public void registerCallBackForUpdatesEveryHour(TimeUpdaterCallBack timerCallBack) {

10         callbacks.add(timerCallBack);

11     }

12

13     // ... This SystemTimer may have more logic here we don't know ...

14

15     // At some point of the implementaion of this SystemTimer (you don't know)

16     // this method will be called and every registered timerCallBack

17     // will be called. Every registered timerCallBack may have a totally

18     // different implementation of the method updateTime() and my be

19     // used in different ways by different clients.

20     public void oneHourHasBeenExprired() {

21

22         for (TimeUpdaterCallBack timerCallBack : callbacks) {

23             timerCallBack.updateTime(System.currentTimeMillis());

24         }

25     }

26 }

  最后是我们虚拟简单的例子中的网站时间更新器:


1 // This is our client. It will be used in our WebSite example. It shall update

2 // the website's time every hour.

3 class WebSiteTimeUpdater {

4

5     public static void main(String[] args) {

6         SystemTimer SystemTimer = new SystemTimer();

7         TimeUpdaterCallBack webSiteCallBackUpdater = new WebSiteTimeUpdaterCallBack();

8         SystemTimer.registerCallBackForUpdatesEveryHour(webSiteCallBackUpdater);

9     }

10 }

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-08-30 16:08:48

理解Java当中的回调机制的相关文章

如何理解java当中的链式方法,需要new关键词吗,如何区分匿名对象,

问题描述 如何理解java当中的链式方法,需要new关键词吗,如何区分匿名对象, 如何理解java当中的链式方法,需要new关键词吗,如何区分匿名对象和链式方法A( ).B( )=?new A( ).B( )的运算顺序是先new A( )再.B( )吗,还是先A( ).B( )再new A( ).B( )有点会混淆的感觉 解决方案 那个是内部类的调用方法,,不必纠结

如何理解java当中的引用传递

问题描述 如何理解java当中的引用传递 涉及几个类,几个对象,几个方法,几个变量,传递的是什么,一定包含main方法吗? 解决方案 一定包含main方法是什么意思,如果是基本类型,其实是值传递,也就是说在方法内部修改不会影响外部,如果是传递对象,传的就是引用,即这个对象的地址值,当你在方法里修改了这个对象的内容,会改变方法外的对象的内容,可以看下Java编程思想的前几章,讲的很清楚 解决方案二: java没有引用传递,只是java中的对象本身是引用类型. 解决方案三: 一.理解 ★ 当一个变量

全面理解java中的异常处理机制_java

一.java异常总结: 异常就是程序运行时出现不正常运行情况 1.异常由来: 通过java的类的形式对现实事物中问题的描述,并封住成了对象 其实就是java对不正常情况描述后的对象体现 2.对于问题的划分有两种:一种是严重的问题,一种是非严重的问题 对于严重的,java通过Error类来描述 对于Error一般不编写针对性的代码对其进行处理 对于非严重的,java通过Exception类来描述 对于Exception可以使用针对性的处理方式进行处理 3.常见的异常有:数组角标越界异常,空指针异常

深入理解Android之接口回调机制_Android

刚开始学对于这个机制理解不够深刻,现在重新整理下思路.开发中,接口回调是我们经常用到的. 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行. 首先解决啥是回调: 举个例子:某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了.过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理.   C不会自己调用b,C提供b的目的就是让S来调用它,而且C不得不提供.

简单理解Java的垃圾回收机制与finalize方法的作用_java

垃圾回收器要回收对象的时候,首先要调用这个类的finalize方法(你可以 写程序验证这个结论),一般的纯Java编写的Class不需要重新覆盖这个方法,因为Object已经实现了一个默认的,除非我们要实现特殊的功能(这 里面涉及到很多东西,比如对象空间树等内容). 不过用Java以外的代码编写的Class(比如JNI,C++的new方法分配的内存),垃圾回收器并不能对这些部分进行正确的回收,这时就需要我们覆盖默认的方法来实现对这部分内存的正确释放和回收(比如C++需要delete). 总之,f

由ArrayList来深入理解Java中的fail-fast机制_java

1. fail-fast简介"快速失败"也就是fail-fast,它是Java集合的一种错误检测机制.某个线程在对collection进行迭代时,不允许其他线程对该collection进行结构上的修改. 例如:假设存在两个线程(线程1.线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出 ConcurrentModificationException 异常,从而产生fa

怎样理解java中的回调函数

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

详解 JAVA的回调机制CallBack_java

序言 CallBack是回调的意思,熟悉Windows编程的人对"回调函数"这四个字一定不会陌生,但是Java程序员对它可能就不太了解了."回调函数"或者"回调方法"是软件设计与开发中一个非常重要的概念,掌握"回调函数"的思想对程序员来说(不管用哪种语言)是非常必要的. 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBac

详解Java的回调机制_java

模块之间总是存在这一定的接口,从调用方式上看,可以分为三类:同步调用.回调和异步调用.下面着重详解回调机制. 1. 概述 Java 中的回调机制是一个比较常见的机制,只是有可能在你的程序中使用得比较少,在一些大型的框架中回调机制随处可见.本文就通过一些具体的实例,慢慢走近 Java 的回调机制. 2.回调 所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法.实际在使用的时候,也会有不同的回调形式,比如下面的这几种. 2.1 同步回调 这里我假设