在WINDOWS中,程序員想讓系統DLL調用自己編寫的一個方法,於是利用DLL當中回調函數(CALLBACK)的接口來編寫程序,使它調用,這個就稱爲回調。在調用接口時,需要嚴格的按照定義的參數和方法調用,並且需要處理函數的異步,否則會導致程序的崩潰。這樣的解釋似乎還是比較難懂,這裏舉個簡單的例子,程序員A寫了一段程序(程序a),其中預留有回調函數接口,並封裝好了該程序。程序員B要讓a調用自己的程序b中的一個方法,於是,他通過a中的接口回調自己b中的方法。目的達到。在C/C++中,要用回調函數,被調函數需要告訴調用者自己的指針地址,但在JAVA中沒有指針,怎麼辦?我們可以通過接口(interface)來實現定義回調函數。
假設我是程序員A,以下是我的程序a:
public class Caller{
private MyCallInterface mc;
public Caller(){}
public setI(MyCallInterface mc){
this.mc=mc;
}
public call(){mc.fuc();}//Caller的調用方法
}
這裏需要定義一個接口,以便程序員B根據我的定義編寫程序實現接口。
public interface MyCallInterface{
public void fuc();
}
於是,程序員B只需要實現這個接口就能達到回調的目的了:
public class callee implements MyCallInterface{
public void fuc(){
//do something
}
}
下面是調用過程:
public class callbacks{
public static void main(String args[]){
Callee c1=new Callee();
Caller caller=new Caller();
caller.setI(c1);
caller.call();
}
}
在以上代碼中,caller是調用者,callee是被調用者,callbacks表示調用過程。
先產生了Callee對象,利用這個callee對象產生的Caller對象則攜帶了一些信息(即與Callee對象的關聯),所以Caller對象可以利用自己的call方法調用Callee的方法。——這就是整個回調過程。
B產生A,則A具有調用B的方法的能力。caller中具有的接口引用很關鍵。實現了此接口引用的callee只需將自己的引用傳給Caller。
一般來說分爲以下幾步:
- 聲明回調函數的統一接口interface A,包含方法fuc();
- 在調用類caller內將該接口設置爲私有成員private A XXX;
- 在caller內提供一個public方法,可以將外部“該接口A的實現類的引用”通過形參傳給XXX;
- caller的某個方法call()中會用到XXX.fuc()方法;
- 在caller的實例中,將實現了A接口的對象的引用傳給caller,後調用call()方法;
注意:步驟3中亦可以使用Caller的構造函數直接實現。
JAVA排序的compare接口:
- interface Compare {
- boolean lessThan(Object lhs, Object rhs);
- boolean lessThanOrEqual(Object lhs, Object rhs);
- }
- import java.util.*;
- public class SortVector extends Vector {
- private Compare compare; // 私有接口成員
- public SortVector(Compare comp) {
- compare = comp;
- }
- public void sort() {
- quickSort(0, size() - 1);
- }
- private void quickSort(int left, int right) {
- if(right > left) {
- Object o1 = elementAt(right);
- int i = left - 1;
- int j = right;
- while(true) {
- while(compare.lessThan(
- elementAt(++i), o1))
- ;
- while(j > 0)
- if(compare.lessThanOrEqual(
- elementAt(--j), o1))
- break;
- if(i >= j) break;
- swap(i, j);
- }
- swap(i , right);
- quickSort(left, i-1);
- quickSort(i+1, right);
- }
- }
- private void swap(int loc1, int loc2) {
- Object tmp = elementAt(loc1);
- setElementAt(elementAt(loc2), loc1);
- setElementAt(tmp, loc2);
- }
- }