用Java讲明白 回调函数Callback的来龙去脉(一)

对于Callback的理解,之前网上看了一堆文章,人都看吐了,大多都是抄来抄去,没有意义。于是花了点时间自己弄懂了,这里分享给大家,如果你看到我这篇日志,恰巧你又想了解回调函数到底是怎么回事,那么恭喜你,你运气不错,请你耐心把这篇文章看完。

为了便于将事情表达清楚,我这里给大家编一个场景吧:
码农(Programmer)现在需要做几件事情:
1、敲代码一整天(敲代码)
2、将今天工作代码上传到Github上(上传代码)
3、备注一下完成日期(记录下完成的日期)

下面我们用程序去实现:
程序一共就三个类:
Programmer(码农类)
Github(Github类 用于保存码农提交的代码)
TestDemo(用于测试并显示结果)
如下所示:
在这里插入图片描述
首先来看Programmer类的代码,很简单:

public class Programmer {

    public void code(){                       
        System.out.println("coding");      //step 1.写代码
        new Github().push();               //step 2.提交代码 
        recordToday();                     //step3. 记录的日期
    }

    public void recordToday(){
        System.out.println("i'm done " + new Date());
    }
}

下面是Github类的代码,他只干一件事情 就是上传代码:

public class Github {
    public void push(){
        System.out.println("git push");
    }
}

TestDemo就更简单了,让Programmer工作:

public class TestDemo {
    public static void main(String args[]){
        Programmer p = new Programmer();
        p.code();
    }
}

运行结果如下:
在这里插入图片描述


上面所有代码都没有涉及 回调函数,下面开始对上面代码进行稍微的修改,引入回调函数。
大家想一想,可否给苦逼程序员一条生路,让他提交代码之后就啥也不管了,像
记录日期:recodeToday()这种事让Github类去负责。
换句话说,Github类的push()函数执行完后,Github类去调用Programmer类的recodeToday()方法,而不是Programmer自己去调用,略微改动后
代码如下:
Programmer:

public class Programmer {
    public void code(){
        System.out.println("coding");
        new Github().push(this);   //注意这里 传入了this给Github类  (后续会解释)
        //这里没有 step3,码农没有自己调用 recordToday()方法.
    }

    public void recordToday(){
        System.out.println("i'm done " + new Date());
    }
}

Github:

public class Github {
    public void push(Programmer p ){   //push的参数多了Programmer类
        System.out.println("git push");
        p.recordToday();    //因为Github类里有Programmer的引用
         							//可以通过引用去调用recodeToday方法
    }
}

TestDemo 类代码无任何变化,不再展示。
运行结果无任何变化,不再展示。

我想大家现在应该理解什么是回调了吧。
回调就是 A类的a()函数 调用B类的x()函数后,B类的x()函数会反过来调用A类的某函数。
例如上面例子中Programmer类的code()函数调用了 Github类的push()函数,而push()函数又反过来调用了Programmer类的recordToday()函数。
recordToday函数就是被“回调”了。

回调就是这个意思,想必大家都明白了吧。
但是真正写Java回调的时候上述步骤会稍微、轻微、特别小有一点点变动,可以让“回调”看起来更优雅一些,下一篇文章:
《用Java讲明白 回调函数Callback的来龙去脉(二)》将作进一步解释。

代码我放在github上了:
https://github.com/zkuestc/CallbackDemo

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值