暂且不提回调函数的各种定义,如我本人,虽然知道JavaScript的回调的使用,但是百科了回调的定义,还是觉得云里来雾里去。所以大可先从已熟悉的入手,旁推侧引它的原理,再引出Java版的实现。 因为博主首先只懂得JavaScript版的回调实现,所以开门见山,先看一段关于JavaScript版的实现Demo。

/**

* simple way to access js callback

*

* Created by choaklin on 14-9-6.

*/

;

// define namespace

var jSkill = {};

jSkill.work = function(callback) {

// first, do something about 'work' logical business

var name = 'Nancy';

console.log('i have done my work');

// end, invoke callback function

callback(name);

};

jSkill.reportWork = function(reporter) {

var date = new Date(),

now = date.getFullYear() + '/' + (date.getMonth() + 1) + '/' + date.getDate();

console.log('Hi, Boss, worker[' + reporter + '] have done her/his works at ' + now);

};

测试入口代码:

window.onload = function() {

jSkill.work(jSkill.reportWork);

};

运行结果:

代码分析:

首先定义了一个namespace—jSkill,避免污染了全局对象。其次在jSkill下定义了功能函数work,你可以想象成它是为响应一个业务而生的。它接收一个参数,是一个预想的函数对象,并且函数内部完成逻辑业务后也把它当作函数使用(函数名() 这是JS调用函数的语法)。接着又声明了个函数reportWork,顾名思义汇报工作用,一个纯粹的函数。 最后界面调用的时候,把reportWork函数当作参数传递给work。页面一加载完,于是就有了如上图的运行结果。

进一步的挖掘,发现JS的回调函数的主要组成因素有:

主调用方得持有被调用方的引用,即函数work运行完自己的主逻辑想打个回马枪,调用reportWork,那么就得持有reportWork的句柄(引用)

在JavaScript中,一切皆是对象,所以函数也是对象,所以也可以当作参数被互相传递

JS部分的回调函数暂时告一段落,接下来我们拿着从JS总结的“回调的组成因素”来看看Java这边的实现

jSkill.work——Worker类

package callback.simple;

/**

* created by choaklin on 14-9-5.

*/

public class Worker {

private String name;

public Worker(String name) {

this.name = name;

}

public void work(Report report) {

// first, do something about 'work' logical business

System.out.println("i have done my work ");

// end, invoke callback function

report.report(name);

}

}

jSkill.reportWork——Report接口及WorkReport类

public interface Report {

public void report(String reporter);

}

public class WorkReport implements Report {

@Override

public void report(String name) {

Calendar calendar = Calendar.getInstance();

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");

String now = dateFormat.format(calendar.getTime());

System.out.println("Hi, Boss, worker[" + name + "] have done her/his works at " + now);

}

}       测试入口——ReportMain类

public class ReportMain {

public static void main(String[] args) {

Worker worker = new Worker("Nancy");

WorkReport workReport = new WorkReport();

worker.work(workReport);

}

}       运行结果:

代码分析: 略

相比于JS的弱类型及运行时语言、一切皆是对象等特性,使得声明一个函数参数可以指向各种不同的函数实现。而对于Java不行,首先函数不是一个对象;其次它是安全性的语言,不允许存在模凌两可的情况出现。也许有人说,更简洁的代码就是直接在Worker#work声明参数为WorkReport类型。OK,程序是可以运行的,结果也是一致的,但是达不到与JS等价的效果——jSkill.work#callback是可以指向任何函数,可Worker#work将只能一直使用WorkReport类型。如果哪天需求改成HealthyReport,显然代码要改2处:客户端调用及参数声明处,不显然利于代码的维护。最好的解决方案就是使用接口。所以在Java中,接口编程实现了回调,回调传播了接口编程。

最后再来看下网上几个关于回调函数的定义,我已经若有所得,你呢?

在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用

程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法

......

这一次的探索,让我不仅懂了回调在Java的实现,更重要的打开了Java中重要的接口编程的大门。

注:Java版的实现并非实际应用的最佳实践,仅供学习使用:-)

java回调函数的生命_Java的回调函数 - choaklin 的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. java获取一个目录下所有字谜_Java 猜字谜游戏 - osc_4jkldo6l的个人空间 - OSCHINA - 中文开源技术交流社区...

    package fundmental_excise6; import java.util.Arrays; import java.util.Scanner; /** * @author : jeasi ...

  2. java脚本项目_java项目部署脚本 - xixingzhe的个人空间 - OSCHINA - 中文开源技术交流社区...

    #!/bin/sh #java export JAVA_HOME=/root/java/jdk #日志目录 export LOG_HOME=`pwd`/ #项目名称 APP_NAME=xxx.jar ...

  3. java 写入环境变量_Java环境变量配置 - import_key的个人空间 - OSCHINA - 中文开源技术交流社区...

    Java 环境变量和路径 在 Solaris 系统上,必须先设置 JAVA_HOME 和 PATH 环境变量,Sun Management Center 3.6 安装向导.设置向导和 Java 控制台 ...

  4. java 实现按规则自增功能_java运算符详解 - osc_74vaali6的个人空间 - OSCHINA - 中文开源技术交流社区...

    java基础(2)--运算符详解 自增自减规则 自增自减就是常用的 a = a++ 或者 a = ++a;前者是后缀式,先把a赋值给a,再加一:后者是后缀式,先加一,在赋值给a;而且a++,++a并不 ...

  5. java方法调用机制_Java方法调用机制 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...

    最近在编程时,修改方法传入对象的对象引用,并没有将修改反映到调用方法中.奇怪为什么结果没有变化,原因是遗忘了Java对象引用和内存分配机制.本文介绍3个点: ① 该问题举例说明 ② 简要阐述Java内 ...

  6. java创建两个foo方法_Java类实例化原理 - osc_foo7glsg的个人空间 - OSCHINA - 中文开源技术交流社区...

    Java对象的创建过程包括类初始化(类实例化两个阶段. 一.Java对象创建时机 (1)使用new关键字创建对象 (2)反射创建对象 使用Class类的newInstance方法 Student st ...

  7. java的Teacher类_java类的继承 - osc_tauwfamo的个人空间 - OSCHINA - 中文开源技术交流社区...

    类的继承是类的一个重要概念,通过类的继承子类可以继承父类的属性和方法,提高代码的复用性. eg: //** *创建一个父类Teacher,父类有两个属性name,age,两个方法sleep(),tea ...

  8. java连连看项目汇报_java连连看小项目 - osc_x4wlt5vu的个人空间 - OSCHINA - 中文开源技术交流社区...

    /* *本人也是刚入门,希望各位多多指教 *该项目主要代码在于连线 *1.2个连线没有拐弯 *2.2个连线有一个拐弯 *3.2个连线有2个拐弯 *采用递归算法 */ package llk; impo ...

  9. java 图形 登录_java登录图形界面 - osc_994n5tsc的个人空间 - OSCHINA - 中文开源技术交流社区...

    编写程序,利用JtextField和JpasswordField分别接收用户输入的用户名和密码,并对用户输入的密码进行检验.对于每个用户名有三次密码输入机会. package beizi; impor ...

最新文章

  1. HDU-2094 产生冠军
  2. 【PC工具】强力推荐:最好用的日历笔记工具,没有之一!google日历
  3. 【数学和算法】最小二乘法,SVD奇异值分解、LU分解的应用场景
  4. 【学习笔记】【Design idea】一、Java异常的设计思想、性能相关、笔记
  5. wxWidgets:wxBitmapComboBox类用法
  6. 创建第一个Django项目
  7. 写一个http服务器
  8. java实现加密电话号码,有具体的加密流程注释
  9. 擎天出口退税软件_新版申报系统退税申报注意事项
  10. php server自定义函数,php:SQL Server用户自定义的函数种类详解
  11. 热烈祝贺《大数据》主编郑纬民教授当选中国工程院院士!!!
  12. OAuth2.0_授权服务配置_令牌服务和令牌端点配置_Spring Security OAuth2.0认证授权---springcloud工作笔记143
  13. windows7下修改hosts文件无效解决办法(转)
  14. JAVA集合Set之HashSet详解_Java基础———集合之HashSet详解
  15. codesmith执行时提示“调用的目标发生了异常”的处理过程经验。
  16. 如何编写好的软件设计文档
  17. 计算机主要应用是什么意思,admin是什么意思 Admin的用途介绍
  18. oracle按序号排序,Oracle排序以及序号的显示
  19. 电脑用久了会变卡怎么办?让电脑变得流畅方法(不要等到蓝屏等无法挽救在着急)
  20. C语言视频教程-谭浩强版-小甲鱼主讲—P13

热门文章

  1. java编程二十_Java语言程序设计(二十)编程练习
  2. Java集合系列---HashMap源码解析(超详细)
  3. Spring框架的快速入门
  4. iOS 关于UITableView的黑科技
  5. Ansible 入门:安装 简例 playbook应用
  6. 如何借助vsftpd在Linux上构建安全的FTP服务?
  7. 如何:将项添加到缓存中
  8. 网络管理员&MCSE2003之2:使用虚拟机Vmware建立多电脑网络环境
  9. 字符串、列表、元组、字典
  10. 数字化转型 数字分析_数字化转型背后的公司领先于开放的领导者