正文  电脑教程 > 服务器教程 >

Java谈回调函数详解

  正题,谈回调函数 (Callback)   解释(引用于百度百科):   回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参...

  正题,谈回调函数 (Callback)

  解释(引用于百度百科):

  回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所

  指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调

  用的,用于对该事件或条件进行响应。

  机制(引用于百度百科):

  ⑴定义一个回调函数;

  ⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;

  ⑶当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。

  意义(个人理解):

  调用者和被调用者的关系简单化,互相不用关心对方的逻辑处理,不用关系对方都程序是怎么的,只关系返回值,这种基于返回值

  的机制很好地使两者的关系简单,明了。

  上代码,以下讲述阿 Ben 去饭堂吃饭的故事

  接口 Callback

  接口定义事情 Done 了之后应该做些什么

  public interface Callback {

  public void Done(String str);

  }

  Ben 类

  阿 Ben 饿了,于是要去 have lunch,他叫了 Aunt 帮他煮个饭,调用 Aunt 的 cookMeal 方法,于是 Aunt 就去煮了,至于怎么煮,Ben 就不用管了,只要煮好了,就调用 Done,给饭阿 Ben 吃就可以了。

  public class Ben implements Callback {

  public void havelunch(Aunt aunt){

  aunt.cookMeal(this);

  }

  @Override

  public void Done(String str) {

  System.out.println(str);

  }

  }

  Aunt 类

  赋值给 str 就是煮饭的过程,煮好之后,就把结果(饭菜)返回给主函数(Ben)。

  public class Aunt {

  String str;

  public void cookMeal(Callback callback){

  str=" 香喷喷的饭菜来咯 "; // 这个就是煮饭的过程

  callback.Done(str);

  }

  }

  测试类

  public class test {

  /**

  * @param args

  */

  public static void main(String[] args) {

  Aunt class2=new Aunt();

  Ben class1=new Ben();

  class1.havelunch(class2);

  }

  }

  结果:

Java谈回调函数详解

  刚才阿姨在煮饭的时候,阿 Ben 是傻乎乎地站在那里等,等同于是在陪阿姨做饭,这个就是同步回调。

  时间怎么可以这么浪费的呢。下面来看看异步回调。

  异步回调

  这个时候,阿姨还是规规矩矩地做饭。而啊 Ben,得同时做点事情。所以只需要修改 Ben 类。

  public class Ben implements Callback {

  public void havelunch(final Aunt aunt){

  new Thread(new Runnable() { //new 一个新的线程去做这个事情,并等待返回结果

  @Override

  public void run() {

  aunt.cookMeal(Ben.this);

  }

  }).start();

  play(); // 在阿姨做饭的时候可以玩一会手机先嘛。就不用傻傻地等了,阿姨煮好饭会喊吃的了。

  }

  public void play(){

  System.out.println(" 玩手机,刷微博,朋友圈,聊扣扣 ");

  }

  @Override

  public void Done(String str) {

  System.out.println(str);

  }

  }

  结果:

  总结:

  回调函数就是那么一回事。

  今天在一篇 nodejs 的文章看到了一句话是这么说的:

  在代码中,异步编程的直接体现就是回调。异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。

  说的不就是这个道理么。呵呵。