对于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