Java 回调函数(匿名内部类)

作者: zhaochenxi 分类: Java 发布时间: 2016-03-12 21:09

回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。以上定义出自维基百科。这种设计是在开发过程中提高代码复用率的利器,在Java自己的类库中我们也常常能够看见这种设计,Android开发中这种设计尤为常见,按钮的点击事件的监听器是android中最常见的一种回调方法了,这种设计在框架开发中也尤为重要,Spring框架中就大量使用了这种设计,如JDBC模板。

在java编程中经常会遇到这个方法:Collections.sort(List list, Comparator< ? super T> c);这个方法就是一个比较典型的回调方法了。它的使用常常是在第二个参数哪里传入一个Comparator的匿名内部类。
如:

List<String> list = new ArrayList<String>();		
Collections.sort(list, new Comparator<String>(){

	@Override
	public int compare(String o1, String o2) {
		// TODO Auto-generated method stub
		return 0;
	}
});

这个方法能够实现根据compare中定义的比较策略来对list排序,那么该方法是怎么实现的呢?我们可以来看java中的源码。
首先Comparator是一个比较接口,在这里面定义了我们熟悉的比较方法:

public interface Comparator<T> {
    int compare(T o1, T o2); 
    boolean equals(Object obj);
}

这是一个泛型的方法,里面的定义了两个方法,equals在定义内部的时候有默认实现,所以不用自己实现。然后我们在看

public static <T> void sort(List<T> list, Comparator<? super T> c) {
        Object[] a = list.toArray();
        Arrays.sort(a, (Comparator)c);
        ListIterator i = list.listIterator();
        for (int j=0; j<a.length; j++) {
            i.next();
            i.set(a[j]);
        }
    }

跟着Arrays.sort(a, (Comparator)c);方法一直向下看我找到了排序使用的合并排序算法,其中调用了我们重写的compare方法。

 private static void mergeSort(Object[] src, Object[] dest,int low, int high, int off,Comparator c) {
       //排序过程………………………………        
        // Merge sorted halves (now in src) into dest
        for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
            if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)//就在这里
                dest[i] = src[p++];
            else
                dest[i] = src[q++];
        }
    }

以上说明要实现这种回调方法,其实很简单,只要你实现一个接口,该接口有一个你需要用来实现具体的业务的策略方法,然后在你在某一个地方调用该策略方法,但是传的参数必须是一个匿名内部类,这样你就可以实现该方法。在执行该方法的时候就会调用你实现的这个方法。我们来看看简化后的例子。

package com.zhaochenxi.callback;

public interface CallBack<T> {
   void execute(T t);
}

//--------------------------------------------------------------
package com.zhaochenxi.callback;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Test test = new Test();
		test.print(new CallBack<String>(){
			@Override
			public void execute(String t) {
				// TODO Auto-generated method stub
				System.out.println("12345");
			}
		
		});
		
		test.print(new CallBack<String>(){
			@Override
			public void execute(String t) {
				// TODO Auto-generated method stub
				System.out.println("-------");
			}
		
		});
		
	}
	
	public void print(CallBack c){
		c.execute("");
	}

}

//打印信息
12345
-------

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注