Java再學習-簡單回撥函式
阿新 • • 發佈:2019-02-06
最近在研究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("做我女朋友好嗎????");
}
}
執行結果:
上面只是一些自己的一些理解,關於回撥函式,我個人理解還是有點欠缺,通過回撥函式,兩個類直接的溝通,相互不會產生太大的影響,完成呼叫。