一直被这个问题困扰了很久,今天小有收获,所以写下来和大家分享共勉。
首先对于回调网上各种大神都有各种说法,也有很多还蛮有意思的比喻,但是看评论我感觉到还是有很多和我一样的初学者没有明白回调的意思,包括为什么要用回调也不是很清楚。现在我先说说到目前,我对回调的理解,大概是这样:
我们通常想使用一个函数或者方法,会直接去调用他的API,但是在有些情况下我们是无法知道API的。比如客户端与服务器端,客户端是无法知道服务器端有什么API的。再比如我们在工程中代码是有分层的,下层为上层提供服务,下层开放给上层的叫API,上层可以随意的调用,但是对于下层来说,他是不知道上层中都有什么函数或者方法以及它的具体实现,所以下层如果想调用上层的方法,就需要借助回调这种机制。比较明确的说法是,将上层中的方法的调用地址或者指针存放在下层的代码中,如果下层需要调用上层的方法,就通过这个指针去调用上层的方法。
令人遗憾的是,在java中没有指针这样一种机制,不过还好,聪明的java的开发者还是给了java实现这种机制的能力。我们可以这样来实现:
首先有一个接口:
public interface MyCallInterface{
public void printName();
}
这个接口可以告诉下层在上层中有这个方法,那么如何告诉呢?很简单,只要在下层的代码中增加一个MyCallInterface类型的filed,
public class Caller{
private MyCallInterface callInterface;
public caller(){} //构造器
public void setCallFunc(MyCallInterface myCallInterface){
this.callInterface = myCallterface; //这一步完成了注册
}
public void call(){
callInterface.printName(); //下层调用上层的方法。如果没有回调就是在这里,下层想调用的上层方法不知道在哪里,但是我们巧妙的通过接口这个机制代替了方法的指针
}
}
上层中自然要对这个接口中的抽象方法重写,声明它的具体实现:
public class Client implements MyCallInterface{
@override
public void printName(){
syste,.out.println("我是上层的方法");
}
}
这时候如果有一个事件触发了下层中的call方法,下层就会想去调用上层中的printName(),这就是回调:
public class Test{
public static void main(String[] args){
Caller caller = new Caller();
caller.setCallFunc(new Client);
caller.call(); //在这里名义下层方法调用了本不该知道的下层方法,这就叫回调,与API相当于是一个逆过程
}
}
其实网上还有一些段子手,说回调相当于你问你妈菜好了么,你妈说你先出去玩,等饭好了再叫你,然后饭好了你吗打电话给你叫你回来吃饭。这里其实你妈就是我这里的下层,你就是上层。
还有什么老板和员工的例子,老板就是上层,员工就是下层,可以对比着我这个例子理解。
以上都只是我的个人理解,欢迎拍砖