最近在研究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() {@Overridepublic void run() {/** * 小徐調用小超中的方法,在這裡註冊回調介面 * 這就相當於A類調用B的方法C */xc.executeMessage(Xu.this, question); }}).start();//小徐問完以後,就去打籃球了。play();}public void play(){System.out.println("我要去打籃球了");}/** * 小超考慮好後調用此方法告訴小徐,就是所謂的小徐的回調方法 */@Overridepublic 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("做我女朋友好嗎。。。。");}}
執行結果:
上面只是一些自己的一些理解,關於回呼函數,我個人理解還是有點欠缺,通過回呼函數,兩個類直接的溝通,相互不會產生太大的影響,完成調用。