用匿名内部类实现 Java 同步回调
在一个应用系统中 , 不论使用何种编程语言 , 模块之间要进行调用 , 仅存在三种方式:同步调用、异步调用、回调 。 本文就其中回调方式进行详细解读 , 并通过匿名内部类的手段 , 在最后实现一个同步回调的过程 。
一、回调的意义在学习回调之前 , 我们需要知道使用回调的原因 , 和回调的应用场景 。
不如先思考两个问题:
- 栈底对栈顶通常是不可见的 , 但是栈顶有时需要直接调用栈底
- 上级派下级做事 , 在此期间 , 下级可能需要通过上级获取高权限的协助
二、如何实现同步回调本文对同步回调的业务需求如下:
- 回调方调用调用方进行数据爬取
- 调用方调用回调方进行数据存储
- 调用方调用回调方进行日志记录
文章插图相应代码如下:
public interface Handler {void handle(String info);}public class Task {private String info;private void setInfo(String info) {this.info = info;}public void call() {Crawler.getInstance().crawl(new Handler() {@Overridepublic void handle(String info) {setInfo(info);}});}}public class Crawler {private static Crawler instance = null;public static Crawler getInstance() {if (instance == null) {instance = new Crawler();}return instance;}private String getInfo() {return "the info from crawler";}public void crawl(Handler handler) {handler.handle(getInfo());}}三、遇到的问题如果我们使用代码来实现上述回调过程 , 不难会发现这样一个问题:Task调用Crawler , Crawler调用Handler , Hanlder调用Task 。 很明显 , 此处存在一个环 , 产生了循环依赖的问题 , 而接口可以为我们提供良好的解决方案 。
文章插图四、为什么通过匿名内部类的方式用 Java 实现同步回调有许多方式 , 为什么我们要通过匿名内部类的方式来实现回调 , 直接回调不香吗?
不妨先看看直接回调的顺序图:
文章插图相应代码如下:
public interface Handler {void handle(String info);}public class Task implements Handler{private String info;private void setInfo(String info) {this.info = info;}public void call() {Crawler.getInstance().crawl(this);}@Overridepublic void handle(String info) {setInfo(info);}}public class Crawler {private static Crawler instance = null;public static Crawler getInstance() {if (instance == null) {instance = new Crawler();}return instance;}private String getInfo() {return "the info from crawler";}public void crawl(Handler handler) {handler.handle(getInfo());}}【用匿名内部类实现 Java 同步回调】直接回调带来的最大问题便是回调接口的暴露 , 也就是说回调接口不一定用于回调 , 也可以用于直接访问 。 这在业务层面的设计上是绝对不允许的 , 而匿名内部类在执行回调等特定业务的同时 , 可以很好的对外隐藏用于回调的接口 。五、总结常规类通常无法对回调等特定接口作出限定 , 要么都可以访问 , 要么都拒绝访问 。 而内部类通过牺牲自身的被访问权限 , 提升了自身访问外部类的能力 , 这使得其成为实现回调的首选方案 。 在JAVA8中 , lambda表达式本质上就是匿名内部类的语法糖 。
注:匿名内部类本质上是成员内部类、局部内部类的简化写法 , 这里将其统称为内部类 。
参考链接[1] <
[2]
[3]
[4]
- 推新标准建新生态,下载超198亿次金山发力海内外
- 看不上|为什么还有用户看不上华为Mate40系列来看看内行人怎么说
- 采用|消息称一加9系列将推出三款新机,新增一加9E
- 会员|美容院使用会员管理软件给顾客更好的消费体验!
- 行业|现在行业内客服托管费用是怎么算的
- 闲鱼|电诉宝:“闲鱼”网络欺诈成用户投诉热点 Q3获“不建议下单”评级
- 整形美容|双十一医美不良事件高发 热玛吉风险高 业内:医美职业打假人太少
- 产业|前瞻生鲜电商产业全球周报第67期:发力社区团购!京东内部筹划“京东优选”
- 美国|英国媒体惊叹:165个国家采用北斗将GPS替代,连美国也不例外?
- 峰会|这场峰会厉害了!政府企业专家媒体共议网络内容生态治理
