基于Java 谈回调函数

 更新时间:2017年05月22日 23:50:47   投稿:mdxy-dxy  
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所 指向的函数时,我们就说这是回调函数

杂谈

还是习惯,写点什么之前,都喜欢来点杂谈。

最近都在搞微信的开发,终于在昨晚进入测试阶段了,好快就测出 bug 来,但也好快修复了。这也让我更担心。

虽说是进入内测阶段,但那代码的结构也真太难看了,还得好好重构一下。迟点得写写关于这微信公众号的开发文章。下次再详谈。

今天开始了三天半的小长假,但我还是坚守在学校。有点不知道为了什么。

刚给 wp 装了个 markdown 插件,爽歪歪!!

在写这篇文章的时候,还是用着 wordpress 的,但在发表的时候,已经换成 hexo 了。原因:没有找到一个完美支持 markdown 的插件,越来越觉得 wp 很臃肿,于是,就拥抱了小萝莉 hexo 了。哈哈。

还有,今天微博看到的一个很赞的神器 GitBook ,分享一下:

Build beautiful programming books and exercises using GitHub/Git and Markdown.

http://www.gitbook.io/

正题,谈回调函数 (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);
  }

}

结果:

刚才阿姨在煮饭的时候,阿 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 的文章看到了一句话是这么说的:

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

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

以上是我个人的理解,如有错误,望指出。

相关文章

  • 一文了解Java中枚举的使用

    一文了解Java中枚举的使用

    Java中枚举,大家在项目中经常使用吧,主要用来定义一些固定值。那你了解枚举的本质吗?了解枚举的一些常见用法吗?本文就来为大家一一进行详解
    2022-09-09
  • 详解SpringBoot容器的生命周期

    详解SpringBoot容器的生命周期

    在使用SpringBoot进行开发时,我们经常需要对Spring容器的生命周期进行了解和掌握,本文将介绍SpringBoot容器的生命周期,包括容器的创建、初始化、销毁等过程,并提供相应的代码示例
    2023-06-06
  • Spring之spring-context-indexer依赖详解

    Spring之spring-context-indexer依赖详解

    这篇文章主要介绍了Spring之spring-context-indexer依赖详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java实现局域网IP地址扫描

    Java实现局域网IP地址扫描

    这篇文章主要为大家详细介绍了Java实现局域网IP地址扫描,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • JSR303校验注解和自定义校验注解的使用

    JSR303校验注解和自定义校验注解的使用

    这篇文章主要介绍了JSR303校验注解和自定义校验注解的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 关于SpringMVC中数据绑定@ModelAttribute注解的使用

    关于SpringMVC中数据绑定@ModelAttribute注解的使用

    这篇文章主要介绍了关于SpringMVC中数据绑定@ModelAttribute注解的使用,SpringMVC是一个基于Spring框架的Web框架,它提供了一种简单、灵活的方式来开发Web应用程序,在开发Web应用程序时,我们需要将用户提交的数据绑定到我们的Java对象上,需要的朋友可以参考下
    2023-07-07
  • SpringBoot同时启动不同端口图示解析

    SpringBoot同时启动不同端口图示解析

    这篇文章主要介绍了SpringBoot同时启动不同端口图示解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • SpringBoot中的Logging详解

    SpringBoot中的Logging详解

    这篇文章主要介绍了SpringBoot中的Logging详解,log配置可能是被忽视的一个环节,一般的项目中日志配置好了基本上很少去改动,我们常规操作是log.info来记录日志内容,很少会有人注意到springBoot中日志的配置,需要的朋友可以参考下
    2023-09-09
  • spring aop execution表达式的用法

    spring aop execution表达式的用法

    这篇文章主要介绍了spring aop execution表达式的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SprinBoot如何集成参数校验Validator及参数校验的高阶技巧

    SprinBoot如何集成参数校验Validator及参数校验的高阶技巧

    这篇文章主要介绍了SprinBoot如何集成参数校验Validator及参数校验的高阶技巧包括自定义校验、分组校验,本文分步骤给大家介绍的非常详细,需要的朋友可以参考下
    2022-05-05

最新评论