分享好友 最新动态首页 最新动态分类 切换频道
详解Java的回调机制
2024-12-27 12:35

模块之间总是存在这一定的接口,从调用方式上看,可以分为三类:同步调用、回调和异步调用。下面着重详解回调机制。

1. 概述

Java 中的回调机制是一个比较常见的机制,只是有可能在你的程序中使用得比较少,在一些大型的框架中回调机制随处可见。本文就通过一些具体的实例,慢慢走近 Java 的回调机制。

2.回调

所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法。实际在使用的时候,也会有不同的回调形式,比如下面的这几种。

2.1 同步回调

这里我假设这样的一种情况。

A 公司的总监 B 跟他的下属(项目经理 C)说要做一个调研,不过不用 C 自己亲力亲为。可以让经理 C 去安排他下面的程序员 D 去完成。经理 C 找到了程序员 D,并告诉他,现在要完成一个调研任务。并且把调研的结果告诉经理 C。如果有问题,还是要继续的。 因为这里是 C 让 D 去做一件事情,之后 D 还是要将结果与 C 进行沟通。这样就是回调的模型了。下面是一般回调的类图:

首先我们要有一个回调的接口 CallbackInterface

CallbackInterface.java

背景里,程序员 D 是要将结果与项目经理 C 进行沟通的,所以这里项目经理需要实现上面的回调接口:

Manager.java

对于程序员 D 来说他需要持有一个经理 C 的引用,以便与他沟通。不过,这里是总监 B 让 经理 C 去安排的任务。也就是说这里也可以让其他的经理,比如说经理 B1, B2等等。因为经理都实现了回调的接口,所以这里就可以直接让程序员 D 持有这个接口就可以了。如下:

Programmer.java

对于总监来说就更简单明了了,因为这相当于一个 Client 测试:

Boss.java

运行结果:

Manager 正在为 Programmer 安排工作
第 1 次研究的结果
第 2 次研究的结果
第 3 次研究的结果
第 4 次研究的结果
第 5 次研究的结果
调研任务结束
为 Programmer 安排工作已经完成,Manager 做其他的事情去了。

2.2 异步回调

还是上面的例子,你的项目经理不可能要一直等你调研的结果。而是把这个任务交给你之后,他就不管了,他做他的,你做你的。所以,这里需要对回调的函数进行异步处理。
所以,这里我们需要修改 Programmer 类的代码,修改如下:

Programmer.java

运行结果:

Manager 正在为 Programmer 安排工作
为 Programmer 安排工作已经完成,Manager 做其他的事情去了。
第 1 次研究的结果
第 2 次研究的结果
第 3 次研究的结果
第 4 次研究的结果
第 5 次研究的结果
调研任务结束

2.3 闭包与回调

闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。

2.3.1 普通调用

首先,我们可以看看在正常情况下的调用是怎么进行的。
Incrementable.java

这是一个普通的接口(在普通调用里只是普通接口,在回调中就是回调接口,这一点应该很好理解吧)。

Callee1.java

Callbacks.java

Callbacks 是一个测试客户端类,没啥好说的,直接看上面的代码。

2.3.2 回调初试

上面的普通调用也没啥好说的,因为这对于一个正常的 Java 程序员来说都应该是想都不用想就可以搞定的事情。

现在如果要构成回调,那么对于程序的结构或是逻辑的思维上都不可能只有一个被调用者(被回调的对象 Callee1),还需要一个调用者对象。调用者可以像下面这样来编写:

Caller.java

这里 Caller 持有一个回调接口的引用 callbackReference,就像在上面说到的程序员需要持有一个项目经理的引用,这样就可以通过这个引用来与项目经理沟通。这里的 callbackReference 也正是起到了这个作用。

现在我们来看看测试类的编写:

Callbacks.java

对于到目前为止的程序代码,完全可以对比上面项目经理安排程序员调研技术难题的代码。有异曲同工之妙。

2.3.3 闭包回调

相比于正常的回调,闭包回调的核心自然是在于闭包,也就是对作用域的控制。
现在假设有一个用户(其他程序员)自定义了一个 MyInCrement 类,同时包含了一个 increment 的方法。如下:

另外有一个类 Callee2 继承自上面这个类:

显而易见这里如果要调用 increment() 方法,就变成了一般的函数调用了。所以这里我们需要修改上面的 Callee2 类,修改的目标就是让 Callee2 类可以兼容 MyInCrement 类的 increment() 方法和 Incrementable 的 increment() 方法。修改后:

注意,这里的 Closure 类是一个私有的类,这是一个闭包的要素。因为 Closure 类是私有的,那么就要有一个对外开放的接口,用来对 Closure 对象的操作,这里就是上面的 getCallbackReference() 方法。 Caller 类则没有改变。
对于测试客户端就直接看代码吧:

最新文章
视频压缩在线工具,推荐6个实用工具
有时候视频文件体积太大不仅会占用设备的存储空间,降低设备的运行效率,在网络状况不佳的情况下,还会导致视频播放卡顿,十分影响用户的视频观看体验。对于这种情况,很多用户会选择压缩视频大小。那么有哪些比较好用的视频压缩在线工具或
西安市建设工程信息网平台/福州seo技巧培训
STL中,要删除容器内的一个元素,其方法会随着容器类型的不同而不同。  例如,对于STL容器c,c包含int类型的元素,现在需要删除c中等于2014的元素。 序列容器即具有连续内存的容器,如vector,
SEO关键词首页排名
SEO关键词首页排名 为什么选择我们的百度关键词排名优化服务?精准分析,量身定制优化策略我们深入分析你的行业和目标受众,帮助你选择最合适的关键词,并制定个性化的优化方案,确保你的网页能够排名靠前,吸引更多的潜在客户。高效优化,
搜索引擎营销文案写作技巧
搜索引擎营销文案写作技巧  我们一直提倡用SEO 的思想去写文章,即合理的将关键词分布在文章中。下面是YJBYS小编整理的搜索引擎营销文案写作技巧,希望对你有帮助!  1.标题醒目  标题是搜索引擎营销文案写作至关重要的地方,必须简单
国内可以24小时挂机的云电脑有哪些?
随着云计算技术的发展,越来越多的人需要使用云计算机。云计算机可以帮助我们随时随地访问桌面环境和应用程序,而不必担心数据丢失和缺乏计算能力。本文将为大家介绍几款可以24小时挂机的国产云电脑主机。1.阿里云阿里云是中国最大的云计算
澄迈爱采购代运营费用
百度爱采购服务商浅谈:上传产品图片需要注意的地方 百度爱采购服务商浅谈:上传产品图片需要注意的地方,不同的商品质量影响着商品的排序程度,主要因素有类目优化程度、图片质量、参数丰富度、时间、地域等,下面来了解下百度爱采购上传
解决方案:如何确保网站被百度收录并提升网站内容质量与优化技术
确保网站被百度收录,对网站的进步极为关键。这表示网站能够吸引更多访客,获得更广泛的关注。网站内容质量网站内容必须保证高水准和原创性。若是内容只是简单的抄袭和拼凑,百度是不会给予关注的。内容要有实际价值,比如提供实用的信息。
数学老师职称工作总结
总结是对某一阶段的工作、学习或思想中的经验或情况进行分析研究的书面材料,它是增长才干的一种好办法,是时候写一份总结了。如何把总结做到重点突出呢?下面是小编收集整理的数学老师职称工作总结,仅供参考,希望能够帮助到大家。在教学
相关文章
推荐文章
发表评论
0评