回调函数的使用

- 日理万妓 2024-03-31 14:28 152阅读 0赞

概述

回调函数,简称回调(Callback),是指通过函数参数传递到其他代码的,某一块可执行代码的引用。

  1. 询问问题(调用对方接口),然后问题解决之后再告诉你(对方处理完再调用你,通知结果),这一过程便是回调。

其有四种实现方法

  1. 反射:Java 的反射机制允许我们获取类的信息,其中包括类的方法
  2. 直接调用;
  3. 接口调用;
  4. Lambda表达式

实现

反射

这种写法需要传递的参数十分繁琐,所以不推荐

  1. public class CallBack {
  2. public void processResponse() {
  3. System.out.println("收到,做相应的处理");
  4. }
  5. }
  6. public class Request{
  7. public void send(Class clazz, Method method) throws Exception {
  8. // 模拟等待响应
  9. Thread.sleep(3000);
  10. System.out.println("开始请求");
  11. method.invoke(clazz.newInstance());
  12. }
  13. }
  14. public class Main {
  15. public static void main(String[] args) throws Exception {
  16. Request request = new Request();
  17. System.out.println("主线程开个线程去异步发请求");
  18. new Thread(() -> {
  19. try {
  20. request.send(CallBack.class, CallBack.class.getMethod("processResponse"));
  21. } catch (Exception e) {
  22. e.printStackTrace();
  23. }
  24. }).start();
  25. System.out.println("主线程请求发完了, 现在在执行其他的事情");
  26. Thread.sleep(100000);
  27. }
  28. }

运行结果

  1. 主线程开个线程去异步发请求
  2. 主线程请求发完了, 现在在执行其他的事情
  3. 开始请求
  4. 收到,做相应的处理

直接调用

与上面反射的区别:

  1. request的send方法里面,没有method这个参数。

    1. public class Request{
    2. public void send(Class clazz, Method method) throws Exception {
    3. // 模拟等待响应
    4. Thread.sleep(3000);
    5. System.out.println("开始请求");
    6. method.invoke(clazz.newInstance());
    7. }
    8. }
  2. 在main方法里面,将callback参数new处理,放入send方法的参数里面

    1. public class Main {
    2. public static void main(String[] args) throws Exception {
    3. Request request = new Request();
    4. System.out.println("主线程开个线程去异步发请求");
    5. CallBack callBack = new CallBack();
    6. new Thread(() -> {
    7. try {
    8. request.send(callBack);
    9. } catch (Exception e) {
    10. e.printStackTrace();
    11. }
    12. }).start();
    13. System.out.println("主线程请求发完了, 现在在执行其他的事情");
    14. Thread.sleep(100000);
    15. }
    16. }

不符合修改封闭原则我们想要换一种“处理响应”的方法时,将必须去修改 CallBack 类的 processRequest()方法

接口调用

这个方法便可以解决直接调用出现的问题

  1. 将callback类改为接口

    1. public interface CallBack {
    2. public void processResponse();
    3. }
  2. 增加一个实现类,实现该接口

    1. public class CallBackImpl implements CallBack {
    2. @Override
    3. public void processResponse() {
    4. System.out.println("收到,做相应的处理");
    5. }
    6. }
  3. main方法里面实例化第二步的callbackImpl实现类

    1. public class Main {
    2. public static void main(String[] args) throws Exception {
    3. Request request = new Request();
    4. System.out.println("主线程开个线程去异步发请求");
    5. CallBack callBack = new CallBackImpl();
    6. new Thread(() -> {
    7. try {
    8. request.send(callBack);
    9. } catch (Exception e) {
    10. e.printStackTrace();
    11. }
    12. }).start();
    13. System.out.println("主线程请求发完了, 现在在执行其他的事情");
    14. Thread.sleep(100000);
    15. }
    16. }

按如上操作后,便可以实现与反射一样的结果

Lambda表达式

这个方法更加简洁,不需要新增callback接口的实现类

  1. 将main方法改写如下

    1. public class Main {
    2. public static void main(String[] args) throws Exception {
    3. Request request = new Request();
    4. System.out.println("主线程开个线程去异步发请求");
    5. new Thread(() -> {
    6. try {
    7. request.send(()-> System.out.println("收到,做相应的处理"));
    8. } catch (Exception e) {
    9. e.printStackTrace();
    10. }
    11. }).start();
    12. System.out.println("主线程请求发完了, 现在在执行其他的事情");
    13. Thread.sleep(100000);
    14. }
    15. }

发表评论

表情:
评论列表 (有 0 条评论,152人围观)

还没有评论,来说两句吧...

相关阅读

    相关 函数使用

    概述 回调函数,简称回调(Callback),是指通过函数参数传递到其他代码的,某一块可执行代码的引用。 1. `询问问题(调用对方接口),然后问题解决之后再告诉你(

    相关 函数

    一、回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理、用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义

    相关 函数

    回调函数是一种函数指针的使用方式。 stdcall和cdecl的区别:这个问题涉及到函数调用的汇编知识,暂只需记住stdcall和cdecl的参数压栈顺序是相同的,参

    相关 函数

    回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实

    相关 函数

    作为JS的核心,回调函数和异步执行是紧密相关的,也是必须跨过去的一道个门槛。 那么究竟什么是回调函数(Callback),其实回调函数并不复杂,明白两个重点即可: 1. 函

    相关 函数

    一、定义 什么是回调函数?它首先是一个函数,这是肯定的,我举个例子:有两个函数A和B,首先应用程序将A的地址告诉B,这称之为注册回调函数,B在收到外部某个命令的时候,可以根据

    相关 函数

    回调与回调函数 回调 回调函数 回调   回调指的是某函数在执行的时候,由于某些原因,该函数被迫中止执行,交出当前线程的使用权,当前线程转而执行其它函

    相关 js函数使用

    在第一次学js的时候,估计很多人对回调函数很蒙,今天有空梳理总结下回调函数,算是一次学习,算是一次总结,也算是一次分享。 文章目录 回调函数执行流程