当前位置: 首页 > news >正文

别再被Java回调绕晕了!搞懂它,代码直接起飞

1. 什么是回调函数

所谓回调函数, 用以回调的函数是也,按其名思义。仅为一功能片段之回调函数, 乃由用户依回调函数调用约定而实现之函数也。身为工作流一部分的回调函数, 由工作流决定函数之调用(回调)时机。其包含以下几个特性:

(1)属于工作流的一个部分;

(2)必须按照工作流指定的调用约定来申明(定义);

(3)其调用的时机是由工作流予以决定的, 回调函数的实现者不可以直接借用调用回调函数去达成工作流的功能。

2. 回调机制

所谓回调机制, 乃是一种常见的设计模式, 其将工作流中间的某一数据处理逻辑, 依据约定的接口, 向外部使用者予以暴露, 为外部使用者供给数据, 或者要求外部使用者提供数据。

正如电脑之上的USB接口那般, 无论插入何种U盘均可, 能够从电脑里面Copy数据, 同时也能够将数据Copy至电脑之中。

3.java的回调机制

软件模块彼此之间始终是有着一定的接口的, 依据调用方式而言, 能够将它们划分作三类,分别是: 同步调用, 回调以及异步调用。

同步调用, 属于一种阻塞式调用, 做调用的一方, 得等待对方执行完毕以后, 才能够返回 , 它是一种单向调用。

回调, 它是一种双向调用模式, 这意味着, 当接口被调用的时候, 被调用的那一方, 也会去调用对方的接口。

异步调用, 是类似于消息或者事件的一种机制, 然而其调用方向恰好相反, 当接口的服务接收到某种讯息时, 或者发生某种事件之时, 会主动去通知客户方, 也就是去调用客户方的接口。

使用回调达成异步消息的注册, 借助异步调用达成消息的通知, 回调与异步调用的关系紧密至极。

4.回调的java例子

例1:

public class CallbackExample { public static void main(String[] args) { FooBar fooBar = new FooBar(); fooBar.setCallback(new ICallback() { public void postExec() { System.out.println("在CallbackExample类中实现但不能被CallbackExample的对象调用,而由FooBar对象调用"); } }); } } interface ICallback { //需要回调的方法 public void postExec(); } class FooBar { private ICallback callback; public void setCallback(ICallback callback) { this.callback = callback; doSth(); } public void doSth() { callback.postExec(); } }class CallbackExample { public static void main(String[] args) { FooBar fooBar = new FooBar(); fooBar.setCallback(new ICallback() { public void postExec() { System.out.println("在CallbackExample类中实现但不能被CallbackExample的对象调用,而由FooBar对象调用"); } }); } } interface ICallback { //需要回调的方法 public void postExec(); } class FooBar { private ICallback callback; public void setCallback(ICallback callback) { this.callback = callback; doSth(); } public void doSth() { callback.postExec(); } }

例2:

public class CallbackFetcherExample { public static void main(String[] args) { new Worker().doWork(); } } interface FetchCallback { void onData(Data data); void onError(Throwable cause); } interface Fetcher { void fetchData(FetchCallback callback); } class Worker { Data data = new Data(); public void doWork() { Fetcher fetcher = new Fetcher() { public void fetchData(FetchCallback callback) { System.out.println("start fetch data..."); callback.onData(data); } }; fetcher.fetchData(new FetchCallback() { public void onData(Data data) { // call if data is fetched without error System.out.println("Data received: " + data); } public void onError(Throwable cause) { //call if error is received during fetch System.err.println("An error accour: " + cause.getMessage()); } }); } } class Data { }class CallbackFetcherExample { public static void main(String[] args) { new Worker().doWork(); } } interface FetchCallback { void onData(Data data); void onError(Throwable cause); } interface Fetcher { void fetchData(FetchCallback callback); } class Worker { Data data = new Data(); public void doWork() { Fetcher fetcher = new Fetcher() { public void fetchData(FetchCallback callback) { System.out.println("start fetch data..."); callback.onData(data); } }; fetcher.fetchData(new FetchCallback() { public void onData(Data data) { // call if data is fetched without error System.out.println("Data received: " + data); } public void onError(Throwable cause) { //call if error is received during fetch System.err.println("An error accour: " + cause.getMessage()); } }); } } class Data { }

观察者模式与回调机制的关系

观察者模式, 是在对象之间去定义一种一对多的依赖关系, 如此这般, 一旦有一个对象发生了状态的改变, 那么那些依赖于它的对象, 就都会接收到通知, 并且会自动地进行更新。

以上篇相关的关于java回调机制以及其实现的博文作为例子, 在例1当中, 可以把被当作一个主题也就是被观察者的实现对象, 当作观察者, 在进行调用的时候, 通知的那个能够改变状态的()方法, 当然了, 这体现的是一对一的依赖关系。

所以, 我们能够将回调机制视作观察者模式的一种特殊类别, 也就是说, 这种情况下仅有一个观察者。

http://www.jsqmd.com/news/1365369/

相关文章:

  • Kimi K3 API实战指南:200万字上下文大模型开发集成与国产替代方案
  • 给 AI Agent 装一台虚拟电脑:Cloudflare Computer 实战解析
  • 佛山机房拆除回收正规公司怎么找:2026资质核验与合规指南 - 广东再生资源回收
  • 基于OCR与目标检测的本地化石碑识别系统构建指南
  • Thorium Reader深度解析:如何高效解决LCPL文件加载崩溃问题
  • 广州雨季高空与吊装施工:设备租赁与现场作业管控要点 - 余生黄金回收
  • Windows Sysinternals工具集:系统管理与安全分析实战指南
  • Java后端字符串清洗实战:处理特殊字符与编码问题的健壮方案
  • LangChain入门指南:从核心组件到RAG应用实战
  • 3分钟掌握Dell G15散热控制终极指南:开源温度监控与风扇管理方案
  • 2026年7月锦州市二手房价格深度分析报告
  • 用 AI 工具提升刷题效率实验报告 最佳实践指南
  • FDE前沿部署工程师:连接研发与生产的实战专家
  • 深圳电缆回收哪家好:2026正规商家测评推荐 - 广东再生资源回收
  • 酒店OA系统推荐:重点看审批流转、合同管理与系统边界 - 数字化办公观察
  • 基于libhv的HTTP大文件分块传输:原理、实现与性能优化
  • GB28181视频监控平台运维优化与质量诊断实践
  • Windows系统部署OpenClaw全流程指南:从环境配置到避坑实战
  • 2026广州吊车租赁选型计价避坑 实体店实操指南 - 余生黄金回收
  • 2026年7月太原市二手房价格深度分析报告
  • 将旧电脑变身高性能游戏串流服务器的完整指南
  • 5分钟掌握Scarab:让空洞骑士模组管理变得前所未有的简单
  • 科颜氏B5贴牌定制,拿样品跟车间大货对不上?看完这篇再下单
  • Godot 4沙盒游戏AI社交系统:多智能体与效用决策实战
  • 终极指南:深度解析RTL8852BE Wi-Fi 6驱动架构与实战优化
  • 如何5分钟完成Switch大气层系统安装:新手终极指南
  • Agent day3
  • Ctrl+C 都关不掉?一个 except 惹的祸
  • 终极SOCD清洁工具Hitboxer:彻底解决游戏输入冲突的免费开源方案
  • 长沙望城正规黄金奢侈品回收门店** 避坑指南 - 小仙贝贝