美文网首页
java 中的 CallBack 回调

java 中的 CallBack 回调

作者: MikeShine | 来源:发表于2021-12-21 21:17 被阅读0次

    1. 写在前面

    之前只是听了很多次回调,知道这是 java 中的一种设计模式,今天就让我们来系统的看一下Callback 这个东西。


    2. 概念

    2.1 使用场景

    当一个方法调用另外一个方法,等另一个方法执行完成后,将结果通知自己,这个就叫做 callback。

    我去问小红问题,小红有事情在忙,等他处理完,把结果告诉我,这就叫做回调。

    2.2 定义

    将 Callback function(回调函数) 当作参数传入另外一个函数中,以便在合适的时候,调用该 callback 方法。

    这个定义其实也指出了 实现方式。


    3. 基础知识

    函数的调用方式无非有以下几种:

    • 同步调用
    • 异步调用
    • 回调

    回调当然也有同步回调和异步回调。

    3.1 同步调用

    同步调用是一种阻塞式的调用,在 a() 方法调用 b() 方法时,只能等到 b() 方法执行完成之后, a() 方法才可以继续向下执行。
    当然,a() 方法可以拿到 b() 方法返回的结果。

    3.2 异步调用

    异步调用是非阻塞的。不用等到后者执行,前者继续执行。

    3.3 回调

    回调的核心在于 互相调用。即在 a() 调用 b() 的时候,到达合适的时机,b()也会调用a()

    这里跟同步调用的不同就在于,回调。
    举一个例子,老师布置作业,学生去做,最终老师拿到了学生交的作业(返回值)。这就是一个同步调用。
    老师布置,学生做,做完了告诉老师(callback),我做完了。这就是一个回调


    4. 实现方式

    在上面的定义里面也提过,将回调方法自己作为参数传递给被调用的参数,是回调实现的核心。

    这里有一个很有趣的例子,来自于 https://www.shuzhiduo.com/A/Lq4zVjGzKr/

    这里分3个阶段来解读这个例子:

    4.1 老师出题

    老师给小明在黑板上出了一道题目,1+1=__ 填空。
    凭借自己的能力,小明很容易搞出来了这个问题。

    public class XiaoMing {
        
        private String name;
    
        public void setName(String name){
            this.name = name;
        }
    
        public XiaoMing(String name){
            this.name = name;
        }
    
        private int add(int ele1, int ele2){
            return ele1+ele2;
        }
    
        private void fillBlank(int ele1, int ele2){
            int result = add(ele1,ele2);
            System.out.println(name+"计算:"+ele1+"+"+ele2+"="+result);
        }
    
    }
    

    4.2 老师刁难

    老师看到小明做出来了,作为变态的她,又出了一个超级难的题目。 524+281=__ 填空。

    小明直接头大,被气的鸡儿梆硬。但是还是硬着头皮做了。

    天无绝人之路,小红带着计算器出现了。

    小明现在可以求助小红和计算器了(此时将二者看作一个整体)。因此小明可以把任务交给小红和计算器,然后自己出去玩。但是此时小明需要将 两个加数需要填空的地方告诉小红,最好的方法就是把自己的引用两个加数告诉她。
    小红做完之后,再调用小明的填空方法,完成填空。

    package callback;
    
    /**
     * @author mikeshine
     */
    
    public class XiaoMing {
    
        private String name;
    
        public void setName(String name){
            this.name = name;
        }
    
        public XiaoMing(String name){
            this.name = name;
        }
    
        public void callHelp(int ele1, int ele2){
            new XiaoHong().calculator(ele1,ele2,this); // 这里是核心
        }
    
        public void fillBlank(int ele1, int ele2, int result){
            System.out.println(name+"计算:"+ele1+"+"+ele2+"="+result);
        }
    
    }
    
    
    package callback;
    
    /**
     * @author mikeshine
     */
    public class XiaoHong {
        public void calculator(int a, int b, XiaoMing xiaoMing){
            int result = a+b;
            xiaoMing.fillBlank(a,b,result);
        }
    }
    
    

    可以看到,上面核心的点还是,A 类 在调用 B 类方法时候,将自身引用 this 传给了B,让B在执行完成后,可以调用A类的方法。

    还有一些更牛逼的写法:https://juejin.cn/post/6844904066129084429

    相关文章

      网友评论

          本文标题:java 中的 CallBack 回调

          本文链接:https://www.haomeiwen.com/subject/ocrcvltx.html