理解Java当中的回调机制(翻译)

 更新时间:2014年10月15日 11:43:01   投稿:mdxy-dxy  
今天我要和大家分享一些东西,举例来说这个在JavaScript中用的很多。我要讲讲回调(callbacks)。你知道什么时候用,怎么用这个吗?你真的理解了它在java环境中的用法了吗?当我也问我自己这些问题,这也是我开始研究这些的原因

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

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

interface CallBack {
 void methodToCallBack();
}

class CallBackImpl implements CallBack {
 public void methodToCallBack() {
  System.out.println("I've been called back");
 }
}

class Caller {

 public void register(CallBack callback) {
  callback.methodToCallBack();
 }

 public static void main(String[] args) {
  Caller caller = new Caller();
  CallBack callBack = new CallBackImpl();
  caller.register(callBack);
 }
}

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

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

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

具体的例子:

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

回调接口:

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

import java.util.ArrayList;
import java.util.List;

// For example: Let's assume that this interface is offered from your OS to be implemented
interface TimeUpdaterCallBack {
 void updateTime(long time);
}

// this is your implementation.
// for example: You want to update your website time every hour
class WebSiteTimeUpdaterCallBack implements TimeUpdaterCallBack {

 @Override
 public void updateTime(long time) {
  // print the updated time anywhere in your website's example
  System.out.println(time);
 }
}

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

// This is the SystemTimer implemented by your Operating System (OS)
// You don't know how this timer was implemented. This example just
// show to you how it could looks like. How you could implement a
// callback by yourself if you want to.
class SystemTimer {

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

 public void registerCallBackForUpdatesEveryHour(TimeUpdaterCallBack timerCallBack) {
  callbacks.add(timerCallBack);
 }

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

 // At some point of the implementaion of this SystemTimer (you don't know)
 // this method will be called and every registered timerCallBack
 // will be called. Every registered timerCallBack may have a totally
 // different implementation of the method updateTime() and my be
 // used in different ways by different clients.
 public void oneHourHasBeenExprired() {

  for (TimeUpdaterCallBack timerCallBack : callbacks) {
   timerCallBack.updateTime(System.currentTimeMillis());
  }
 }
}

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

// This is our client. It will be used in our WebSite example. It shall update
// the website's time every hour.
class WebSiteTimeUpdater {

 public static void main(String[] args) {
  SystemTimer SystemTimer = new SystemTimer();
  TimeUpdaterCallBack webSiteCallBackUpdater = new WebSiteTimeUpdaterCallBack();
  SystemTimer.registerCallBackForUpdatesEveryHour(webSiteCallBackUpdater);
 }
}

原文:http://cleancodedevelopment-qualityseal.blogspot.com/2012/10/understanding-callbacks-with-java.html

相关文章

  • java-SSH2实现数据库和界面的分页

    java-SSH2实现数据库和界面的分页

    本文主要是介绍SSH2实现数据库和界面的分页的代码,分页在web应用中是经常要做的事情,实用性比较大,有需要的朋友可以来了解一下。
    2016-10-10
  • Java简单计时的实现案例(可以用来限时循环)

    Java简单计时的实现案例(可以用来限时循环)

    这篇文章主要介绍了Java简单计时的实现案例(可以用来限时循环),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java语言资源国际化步骤解析

    Java语言资源国际化步骤解析

    这篇文章主要介绍了Java语言资源国际化步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • java8如何用Stream查List对象某属性是否有重复

    java8如何用Stream查List对象某属性是否有重复

    这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 浅谈JDK9的特性之JVM的xlog

    浅谈JDK9的特性之JVM的xlog

    在java程序中,我们通过日志来定位和发现项目中可能出现的问题。在现代java项目中,我们使用log4j或者slf4j,Logback等日志记录框架来处理日志问题。本文将介绍JDK9的特性之JVM的xlog。
    2021-06-06
  • Java实现Fibonacci(斐波那契)取余的示例代码

    Java实现Fibonacci(斐波那契)取余的示例代码

    这篇文章主要介绍了Java实现Fibonacci取余的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 使用spring mail发送html邮件的示例代码

    使用spring mail发送html邮件的示例代码

    本篇文章主要介绍了使用spring mail发送html邮件的示例代码,这里整理了详细的示例代码,具有一定的参考价值,有兴趣的可以了解一下
    2017-09-09
  • Spring的编程式事务和声明式事务详解

    Spring的编程式事务和声明式事务详解

    这篇文章主要介绍了Spring的编程式事务和声明式事务的相关内容,涉及Spring事务属性、Spring事务的基本类等知识,需要的朋友可以了解下。
    2017-09-09
  • Java递归和迭代区别详细介绍

    Java递归和迭代区别详细介绍

    这篇文章主要给大家介绍了关于Java中的迭代和递归有什么区别,文中介绍的非常详细,感兴趣的同学可以参考阅读
    2023-04-04
  • Java之操作Redis案例讲解

    Java之操作Redis案例讲解

    这篇文章主要介绍了Java之操作Redis案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08

最新评论