在上一篇文章中讲了Spring的JDBC框架—JdbcTemplate模板类。在JdbcTemplate所实现的接口JdbcOperations中并没有用传统的JDBC API类和方法,而是使用了CallBack参数。在JdbcTemplate中对JdbcOperations的方法进行实现时才真正使用传统JDBC API中的类和方法。这里的CallBack是什么?为什么要用?实现机制又是什么?
一、CallBack是什么?
CallBack很多时候我们叫"回调",也叫"回叫"。就像打电话时对方不在,但在对方手机上保留了未接来电,等对方看见未接来电时再使用未接来电回叫你。
有了这个例子,可以很好地理解在我们的程序开发过程中了。
在一个应用程序中,其中要对一个数组进行排序。由于排序算法效率的问题,暂时不知道要采用什么排序算法比较合理。此时就可以在原本打算实现排序算法的地方(方法)定义一个CallBack参数,然后调用这个CallBack参数(一般CallBack定义为一个接口,然后调用这个接口的方法)。而在真正调用排序算法时才实例化这个CallBack参数,来决定使用何种排序算法来实现。
二、为什么要用CallBack?
从上面我们可以知道,使用CallBack可以使我们的应用程序更加灵活。
三、CallBack的实现机制?
CallBack一般是在原来打算实现功能的方法中定义为方法的参数,然后调用。而具体CallBack的实现是在真正使用时才实例化CallBack,一般采用匿名内部类来实现实际的功能。
四、实例:以上面的排序为例讲解回调的定义和实现。
1、常规方式实现功能:不用CallBack。
package callback; public class NoUseCallBackSort { /** * 具体排序功能实现的定义 */ public static void sort(int[] a){ //具体的排序功能实现代码 } /** * 调用排序功能的方法 */ public void exeSort(){ int[] arr =new int[5]{31,5,956,7,89}; sort(srr); } public static void main(String[] args) { NoUseCallBackSort test=new NoUseCallBackSort(); test.exeSort(); } }
2、使用CallBack的实现:包含两个Java文件
一个是CallBack接口的定义:
package callback; public interface CallBack { //执行回调操作的方法 void execute(); }
然后就是调用CallBack来实现排序的类文件:
ackage callback; public class UseCallBackSort { /** * 实现排序功能,通过定义CallBack接口的execute方法 * @param callBack */ public void sort(int[] a,CallBack callBack) { callBack.execute(); ///进行回调操作 } public static void main(String[] args) { UseCallBackSort test = new UseCallBackSort(); int arr[]={3,2,4,6,5 }; test.sort(arr,new CallBack(){ //定义execute方法 public void execute(){ //这里可以加放一个或多个排序方法 NoUseCallBackSort.exeSort(); } }); } }
用匿名内部类来实例化CallBack。