1. 程式人生 > >Java再學習-簡單回撥函式

Java再學習-簡單回撥函式

   最近在研究Spring原始碼,其中有一個回撥函式的概念,一直出現,而且出現的頻率非常大,小編就查了好多資料,但是總是感覺不太實際,而且不容易理解,小編結合自己的事蹟,結合生活,做了這麼幾段程式碼。

首先,回撥函式,就是A類呼叫B類的方法C,然後B類反過來要呼叫A類中的方法D,這個D就是傳說中的回撥函式!感覺還是非常抽象,直接上例子吧。

回撥函式介面:

package SpringCallback;
/** 
 * 這是一個回撥介面 
 * @author xzp
 * 
 */  
public interface CallBack {  
    /** 
     * 這個是小超考慮好以後要呼叫的函式告訴小徐,也就是回撥函式 
     * @param result 是答案 
     */  
    public void solve(String result);  
} 

其中一個類:

package SpringCallback;
/**
 * 這個是小徐
 * @author xzp
 * 
 */
public class Xu implements CallBack {
	/**
	 * 小李物件的引用
	 * 相當於----->背景二
	 */
	private Xc xc; 

	/**
	 * 小徐的構造方法,持有小超的引用
	 * @param xc
	 */
	public Xu(Xc xc){
		this.xc = xc;
	}
	
	/**
	 * 小徐通過這個方法去問小超的問題
	 * @param question  就是小徐要問的問題,做我女朋友好嗎?
	 */
	public void askQuestion(final String question){
		//這裡用一個執行緒就是非同步,
		new Thread(new Runnable() {
			@Override
			public void run() {
				/**
				 * 小徐呼叫小超中的方法,在這裡註冊回撥介面
				 * 這就相當於A類呼叫B的方法C
				 */
				xc.executeMessage(Xu.this, question); 
			}
		}).start();
		
		//小徐問完以後,就去打籃球了。
		play();
	}

	public void play(){
		System.out.println("我要去打籃球了");
	}

	/**
	 * 小超考慮好後呼叫此方法告訴小徐,就是所謂的小徐的回撥方法
	 */
	@Override
	public void solve(String result) {
		System.out.println("小超告訴小徐的答案是--->" + result);
	}
	
}

另一個類:
package SpringCallback;
/**
 * 這個就是小徐啦
 * @author xzp
 *
 */
public class Xc {
	/**
	 * 
	 * @param callBack  
	 * @param question  小徐問的問題
	 */
	public void executeMessage(CallBack callBack, String question){
		System.out.println("小徐問的問題--->" + question);
		
		//模擬小超要睡覺了,加入睡了很長時間
		for(int i=0; i<2000000000;i++){
			
		}
		
		/**
		 * 小超睡醒後想到的是 好,同意!!!
		 */
		String result = "好,同意!!!";
		
		/**
		 * 於是就告訴小徐,呼叫小徐中的方法
		 * 這就相當於B類反過來呼叫A的方法D
		 */
		callBack.solve(result); 

		
		
	}
	
}

測試類:
package SpringCallback;
/**
 * 測試類
 * @author xzp
 *
 */
public class Test {
	public static void main(String[]args){
		/**
		 * 例項化小超 new一個小超
		 */
		Xc xc = new Xc();

		/**
		 * 呼叫小徐的構造方法,加上小超的引用
		 */
		Xu xu = new Xu(xc);
		
		/**
		 * 小徐問小超的問題
		 */
		xu.askQuestion("做我女朋友好嗎????");
	}
}

執行結果:


上面只是一些自己的一些理解,關於回撥函式,我個人理解還是有點欠缺,通過回撥函式,兩個類直接的溝通,相互不會產生太大的影響,完成呼叫。