解析Java接口回调机制 - 极悦
首页 课程 师资 教程 报名

解析Java接口回调机制

  • 2020-10-27 17:52:38
  • 1387次 极悦

回调(callback)是 Java 中很重要的一个概念,我们在学习Spring、Hibernate等计算框架时其实已经为Java回调机制的学习埋下了伏笔。我们都知道控制反转(Inversion of Control,IoC),它是一个重要的面向对象编程的法则,用来削减计算机程序的耦合问题,也是轻量级的 Spring 框架的核心。而控制反转的本质,就是 Java接口回调机制


在某些面向过程(事件驱动)的编程语言(如 C 语言)中,开发人员可以通过传递函数指针(function pointer)直接实现回调机制,回调的对象可能是一段代码块(方法块)。但 Java 作为一门面向对象的编程语言,并不支持方法指针(method pointer,在 Java 中,方法的地位等同于 C 中的函数),所以想实现回调机制,必须通过「对象(object)」来完成,这似乎妨碍了回调机制的完成。


回调的思想是:

类A的a()方法调用类B的b()方法

类B的b()方法执行完毕主动调用类A的callback()方法

通俗而言: 就是A类中调用B类中的某个方法C, 然后B类中反过来调用A类中的方法D, D这个方法就叫回调方法, 这样子说你是不是有点晕晕的, 其实我刚开始也是这样不理解, 看了人家说比较经典的回调方式:

1.class A实现接口CallBack callback——背景1

2.class A中包含一个class B的引用b ——背景2

3.class B有一个参数为callback的方法f(CallBack callback) ——背景3

4.A的对象a调用B的方法 f(CallBack callback) ——A类调用B类的某个方法 C

5.然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法D


Java「关上了一扇门,必然会为你开启另一扇窗」,而这扇窗就是「接口」。我们通过下面的例子来说明,在 Java 中,调 Java 回调机制的演示(Caller.java)。

interface CallBack

{

void methodToCallBack( );

}

class CallBackImpl implements CallBack

{

public void methodToCallBack( )

{

System.out.println("I'"ve been called back");

}

}

public class Caller

{

public void register(CallBack callback)

{

callback.methodToCallBack( );

}

public static void main(String[] args)

{

Caller caller = new Caller( );

CallBack callBack = new CallBackImpl( );

caller.register(callBack);

}

}

保存并运行程序,结果如下图所示。

image.png


代码详解

第 01~04 行,声明了一个接口 CallBack,在这个接口中声明了一个抽象方法 methodToCallBack( )。

第 05~11 行,用一个名为 CallBackImpl 的类,实现了接口 CallBack。

第 12~24 行,设计了一个主调类 Caller,其中第 14~17 行声明了一个注册方法 register(),特别需要注意的是,这个方法的参数是接口对象 CallBack 的引用。

第 20 行,新建了一个 Caller 对象,第 21 行新建了一个 CallBackImpl 的对象,它是接口 CallBack 的具体实现者。

第 22 行,调用注册方法 register(),实参就是 CallBackImpl 的对象 callBack,因为 CallBackImpl 实现(某种程度上可以说是继承)了抽象接口,所以在 register()方法中,callBack 可以调用 methodToCallBack()方法。

或许,读者会困惑,为什么不在第 21 行之后这么做。

callback.methodToCallBack()

这样岂不是更加简便?的确如此。

但这段代码不在于如何用最短的代码实现具体功能,而是为了给我们展示一下,如何在 Java 环境下实现一个回调机制。

我们知道,回调机制的真正意图,其实是为了实现「控制反转(Inversion of Control)」。通过控制反转,对象在被创建的时候(如第 21 行),由一个能够调控系统内所有对象的外界实体(如第 20 行的 caller),将其所依赖的对象的引用传递给功能方法块(如第 22 行的 callBack,被送入到 register()中)。

我们知道,同一个接口,可以有不同的实现类,从而使得这些不同的实现类,可以定义众多不同的对象,而这些对象会被按需「注入」功能方法块 register()。在被调用前,这些对象永远处于等待调用状态,直到有一天被回调(callback)。


由上分析可知,控制反转可以用来降低计算机代码之间的耦合度。总结起来,回调的核心就是回调方将本身即this传递给调用方,这样调用方就可以在调用完毕之后告诉回调方它想要知道的信息。回调是一种思想、是一种机制,至于具体如何实现,如何通过代码将回调实现得优雅、实现得可扩展性比较高,一看开发者的个人水平,二看开发者对业务的理解程度。观看本站的Java接口教程,学习Java接口的回调机制,在你的代码中实现Java接口的回调吧!


选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交