Java回调机制分析

Wesley13
• 阅读 483

Java回调是一种双向调用模式,什么意思呢,就是说,被调用方在被调用时也会调用对方,这就叫回调。“If you call me, i will call back”。
不理解?没关系,先看看这个可以说比较 经典的使用回调的方式

  • class A实现接口InA ——背景1
  • class A中包含一个class B的引用b ——背景2
  • class B有一个参数为InA的方法test(InA a) ——背景3
  • A的对象a调用B的方法传入自己,test(a) ——这一步相当于you call me
  • 然后b就可以在test方法中调用InA的方法 ——这一步相当于i call you back

是不是清晰一点了?下面再来看一个完全符合这个方式模板的例子

(PS:这个例子来源于网络,由于这个例子表现的功能极度拉风,令我感觉想想出一个超越它的例子确实比较困难,所以直接搬过来)

//相当于接口InA
public interface BoomWTC{
  //获得拉登的决定Java实现Ping
  public benLaDengDecide();

  // 执行轰炸世贸
  public void boom();
}

//相当于class A
public class At$911 implements BoomWTC{//相当于【背景1】
  private boolean decide;
  private TerroristAttack ta;//相当于【背景2】

  public At$911(){
    Date now=new Date();
    SimpleDateFormat myFmt1=new SimpleDateFormat("yy/MM/dd HH:mm");
    this.dicede= myFmt.format(dt).equals("01/09/11 09:44");
    this.ta=new TerroristAttack();
  }

  //获得拉登的决定
  public boolean benLaDengDecide(){
    return decide;
  }

  // 执行轰炸世贸
  public void boom(){
    ta.attack(new At$911);//class A调用class B的方法传入自己的对象,相当于【you call me】
  }
}

//相当于class B
public class TerroristAttack{
  public TerroristAttack(){
  }

  public attack(BoomWTC bmw){——这相当于【背景3】
    if(bmw.benLaDengDecide()){//class B在方法中回调class A的方法,相当于【i call you back】
     //let's go.........
    }
  }
}

现在应该对回调有一点概念了吧。
可是问题来了,对于上面这个例子来说,看不出用回调有什么好处,直接在调用方法不就可以了,为什么要使用回调呢
事实上,很多需要进行回调的操作是比较费时的,被调用者进行费时操作,然后操作完之后将结果回调给调用者。看这样一个例子:

//模拟Spring中HibernateTemplate回调机制的代码
    interface CallBack{  
        public void doCRUD();  
    } 
     
    public class HibernateTemplate {  
         
        public void execute(CallBack action){ 
            getConnection(); 
            action.doCRUD(); 
            releaseConnection(); 
        } 
      
        public void add(){ 
             execute(new CallBack(){ 
                public void doCRUD(){ 
                    System.out.println("执行add操作..."); 
                } 
             }); 
        }  
     
        public void getConnection(){ 
            System.out.println("获得连接..."); 
        } 
         
        public void releaseConnection(){ 
            System.out.println("释放连接..."); 
        } 
         
    } 
可能上面这个例子你不能一眼看出个所以然来,因为其实这里A是作为一个内部匿名类存在的。好,不要急,让我们把这个例子来重构一下:

interface CallBack{   //相当于接口InA
    public void doCRUD();  

public class A implements CallBack{//【背景1】
    private B b;//【背景2】
    public void doCRUD(){ 
          System.out.println("执行add操作..."); 
     } 

     public void add(){ 
             b.execute(new A());//【you call me】 
        } 
}

public class B{
     public void execute(CallBack action){  //【背景3】
            getConnection(); 
            action.doCRUD();  //【i call you back】
            releaseConnection(); 
        } 

      public void getConnection(){ 
            System.out.println("获得连接..."); 
        } 
         
        public void releaseConnection(){ 
            System.out.println("释放连接..."); 
        } 
}

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
灯灯灯灯 灯灯灯灯
2年前
JAVA回调机制(CallBack)之小红是怎样买到房子的??
JAVA回调机制CallBack序言最近学习java,接触到了回调机制(CallBack)。初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义。当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题。但是,对于初学的我来说,缺了一个循序渐进的过程。此处,将我对回调机制的个人理解,按
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
thinkcmf+jsapi 实现微信支付
首先从小程序端接收订单号、金额等参数,然后后台进行统一下单,把微信支付的订单号返回,在把订单号发送给前台,前台拉起支付,返回参数后更改支付状态。。。回调publicfunctionnotify(){$wechatDb::name('wechat')where('status',1)find();
菜园前端 菜园前端
1年前
什么是回调函数?
原文链接:什么是回调函数?简单的来说,一个函数作为另外一个函数的参数,可以称为回调函数。这个理解其实不完全对,回调的意义根本没有体现出来,何为回调?也就是说一个函数你定义了,你没有马上的去调用它,而是交给了另外一个函数去调用,这才属于回调函数。缺点直接使用
Wesley13 Wesley13
2年前
Java回调机制如何理解?
首先,参考一下众多文章中,把接口回调讲得比较浅显易懂的两篇文章:浅谈Java回调机制20160409wa\_lid阿里百川(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp.weixin.qq.com%2Fs%2FgGccIRfdL2acBitPhD4mg)Jav
Stella981 Stella981
2年前
JavaScript回调函数的高手指南
摘要:本文将会解释回调函数的概念,同时帮你区分两种回调:同步和异步。回调函数是每个前端程序员都应该知道的概念之一。回调可用于数组、计时器函数、promise、事件处理中。本文将会解释回调函数的概念,同时帮你区分两种回调:同步和异步。1.回调函数首先写一个向人打招呼的函数。只需要创建一个接受name参数的函数gree
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这