java回调函数的生命_Java的回调函数 - choaklin 的个人空间 - OSCHINA - 中文开源技术交流社区...
暂且不提回调函数的各种定义,如我本人,虽然知道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 - 中文开源技术交流社区...相关推荐
- java获取一个目录下所有字谜_Java 猜字谜游戏 - osc_4jkldo6l的个人空间 - OSCHINA - 中文开源技术交流社区...
package fundmental_excise6; import java.util.Arrays; import java.util.Scanner; /** * @author : jeasi ...
- java脚本项目_java项目部署脚本 - xixingzhe的个人空间 - OSCHINA - 中文开源技术交流社区...
#!/bin/sh #java export JAVA_HOME=/root/java/jdk #日志目录 export LOG_HOME=`pwd`/ #项目名称 APP_NAME=xxx.jar ...
- java 写入环境变量_Java环境变量配置 - import_key的个人空间 - OSCHINA - 中文开源技术交流社区...
Java 环境变量和路径 在 Solaris 系统上,必须先设置 JAVA_HOME 和 PATH 环境变量,Sun Management Center 3.6 安装向导.设置向导和 Java 控制台 ...
- java 实现按规则自增功能_java运算符详解 - osc_74vaali6的个人空间 - OSCHINA - 中文开源技术交流社区...
java基础(2)--运算符详解 自增自减规则 自增自减就是常用的 a = a++ 或者 a = ++a;前者是后缀式,先把a赋值给a,再加一:后者是后缀式,先加一,在赋值给a;而且a++,++a并不 ...
- java方法调用机制_Java方法调用机制 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...
最近在编程时,修改方法传入对象的对象引用,并没有将修改反映到调用方法中.奇怪为什么结果没有变化,原因是遗忘了Java对象引用和内存分配机制.本文介绍3个点: ① 该问题举例说明 ② 简要阐述Java内 ...
- java创建两个foo方法_Java类实例化原理 - osc_foo7glsg的个人空间 - OSCHINA - 中文开源技术交流社区...
Java对象的创建过程包括类初始化(类实例化两个阶段. 一.Java对象创建时机 (1)使用new关键字创建对象 (2)反射创建对象 使用Class类的newInstance方法 Student st ...
- java的Teacher类_java类的继承 - osc_tauwfamo的个人空间 - OSCHINA - 中文开源技术交流社区...
类的继承是类的一个重要概念,通过类的继承子类可以继承父类的属性和方法,提高代码的复用性. eg: //** *创建一个父类Teacher,父类有两个属性name,age,两个方法sleep(),tea ...
- java连连看项目汇报_java连连看小项目 - osc_x4wlt5vu的个人空间 - OSCHINA - 中文开源技术交流社区...
/* *本人也是刚入门,希望各位多多指教 *该项目主要代码在于连线 *1.2个连线没有拐弯 *2.2个连线有一个拐弯 *3.2个连线有2个拐弯 *采用递归算法 */ package llk; impo ...
- java 图形 登录_java登录图形界面 - osc_994n5tsc的个人空间 - OSCHINA - 中文开源技术交流社区...
编写程序,利用JtextField和JpasswordField分别接收用户输入的用户名和密码,并对用户输入的密码进行检验.对于每个用户名有三次密码输入机会. package beizi; impor ...
最新文章
- HDU-2094 产生冠军
- 【PC工具】强力推荐:最好用的日历笔记工具,没有之一!google日历
- 【数学和算法】最小二乘法,SVD奇异值分解、LU分解的应用场景
- 【学习笔记】【Design idea】一、Java异常的设计思想、性能相关、笔记
- wxWidgets:wxBitmapComboBox类用法
- 创建第一个Django项目
- 写一个http服务器
- java实现加密电话号码,有具体的加密流程注释
- 擎天出口退税软件_新版申报系统退税申报注意事项
- php server自定义函数,php:SQL Server用户自定义的函数种类详解
- 热烈祝贺《大数据》主编郑纬民教授当选中国工程院院士!!!
- OAuth2.0_授权服务配置_令牌服务和令牌端点配置_Spring Security OAuth2.0认证授权---springcloud工作笔记143
- windows7下修改hosts文件无效解决办法(转)
- JAVA集合Set之HashSet详解_Java基础———集合之HashSet详解
- codesmith执行时提示“调用的目标发生了异常”的处理过程经验。
- 如何编写好的软件设计文档
- 计算机主要应用是什么意思,admin是什么意思 Admin的用途介绍
- oracle按序号排序,Oracle排序以及序号的显示
- 电脑用久了会变卡怎么办?让电脑变得流畅方法(不要等到蓝屏等无法挽救在着急)
- C语言视频教程-谭浩强版-小甲鱼主讲—P13