深入理解Java回调函数
廢話不多說,像許多網(wǎng)上介紹回調(diào)機(jī)制的文章一樣,我這里也以一個現(xiàn)實的例子開頭:假設(shè)你公司的總經(jīng)理出差前需要你幫他辦件事情,這件事情你需要花些時間去做,這時候總經(jīng)理肯定不能守著你做完再出差吧,于是就他告訴你他的手機(jī)號碼叫你如果事情辦完了你就打電話告訴他一聲;這是一個現(xiàn)實生活中常能碰到的例子,我們用呢就用代碼的方式來實現(xiàn)一個這個過程,看一下這個過程究竟是怎樣的。
首先在Eclipse中新建一個Java項目:CallBackDemoInJava;
然后再新建三個類:Manager(該類用來模擬總經(jīng)理)、Personnel(該類用來模擬員工)、Main(主類);
Manager的代碼如下:
package com.test; /** * @description 該類用來模擬總經(jīng)理 */ public class Manager { /** * @param personnel * 傳入一個員工類的對象 */ public Manager(Personnel personnel) { // 想讓該讓員工做什么 personnel.doSomething(this, "整理公司文件"); } /** * @description 當(dāng)員工做完總經(jīng)理讓他做的事后就通過該方法通知總經(jīng)理 * @param result * 事情結(jié)果 */ public void phoneCall(String result) { System.out.println("事情" + result); } }
Manager類是個模擬總經(jīng)理的類,當(dāng)該類的對象被造出來后就會通過Personnel的對象去執(zhí)行Personnel中的doSomething方法告訴員工做些什么
Personnel的代碼如下:
package com.test; /** * @description 該類用來模擬員工 */ public class Personnel { public void doSomething(Manager manager, String task) { // 總經(jīng)理通過doSomething方法告訴員工要做什么 System.out.println("總經(jīng)理要你做" + task); String result = "做完了"; // 當(dāng)事情做完了我們就通過總經(jīng)理公布的phoneCall方法通知總經(jīng)理結(jié)果 manager.phoneCall(result); } }
總經(jīng)理通過調(diào)用Personnel中的doSomething方法告訴員工該做些什么,當(dāng)員工做完后就通過Manager中的phoneCall方法通知總經(jīng)理結(jié)果
那么好的!萬事俱備,我們在Main中測試運(yùn)行下代碼看看結(jié)果:
package com.test; public class Main { public static void main(String[] args) { // 首先我們需要一個員工 Personnel personnel = new Personnel(); // 其次把這個員工指派給總經(jīng)理 new Manager(personnel); } }
代碼執(zhí)行結(jié)果如下:
回到我們剛才舉的那個現(xiàn)實中的例子:總經(jīng)理出差前要你去辦件事情,這件事情通過doSomething告訴你了,事情要是辦完了就打總經(jīng)理的電話phoneCall通知他一聲。這里的phoneCall我們就稱為回調(diào)方法,為什么稱之為回調(diào)呢?你問我我也不清楚哈~這你得問Sun公司了,不過我們從代碼的執(zhí)行過程可以看出數(shù)據(jù)的流向大致是Manager—–>Personnel—–>Manager,這不就是一個“回調(diào)”的過程么?現(xiàn)在我們來總結(jié)下滿足回調(diào)的兩個基本條件:
1.Class A調(diào)用Class B中的X方法
2.ClassB中X方法執(zhí)行的過程中調(diào)用Class A中的Y方法完成回調(diào)
一切看上去都很完美~以上例子代碼簡單通俗地描述了回調(diào),但是這里我就會有這樣一個疑問:假設(shè)總經(jīng)理出差前交了件事情給我去辦,不巧……副總經(jīng)理也要給我件事去辦,更無恥的是……主管也發(fā)任務(wù)過來了,都要求說做完就打電話通知他們……這時我們就要定義更多類,什么總經(jīng)理類啦~經(jīng)理類啦~主管類啦~雜七雜八的類,但是這些雜七雜八的大爺們都要求做完事情就電話通知,每個類都會有一個類似phoneCall的方法作為回調(diào)方法,這時,我們利用面向?qū)ο蟮乃枷雭砜磣是不是可以把這個回調(diào)方法抽象出來作為一個獨(dú)立的抽象類或接口呢?多態(tài)的思想油然而生~~~鑒于JAVA接口的好處,我們就定義一個名為CallBack的接口作為回調(diào)接口,再在該接口下定義一個名為backResult的抽象方法作為回調(diào)方法,讓那些總經(jīng)理類啦~經(jīng)理類啦~主管類啦~什么的都去實現(xiàn)該接口,這時候我們就來改造下我們的項目:
CallBack代碼如下:
package com.test; /** * @description 該類用來模擬總經(jīng)理 */ public class Manager implements CallBack { /** * @param personnel * 傳入一個員工類的對象 */ public Manager(Personnel personnel) { // 想讓該讓員工做什么 personnel.doSomething(this, "整理公司文件"); } /** * @description 當(dāng)員工做完總經(jīng)理讓他做的事后就通過該方法通知總經(jīng)理 * @param result * 事情結(jié)果 */ public void backResult(String result) { System.out.println("事情" + result); } }
Personnel代碼改造后如下:
doSomething方法不再傳入一個Manager對象而是一個CallBack接口:
package com.test; /** * @description 該類用來模擬員工 */ public class Personnel { public void doSomething(CallBack callBack, String task) { // 總經(jīng)理通過doSomething方法告訴員工要做什么 System.out.println("總經(jīng)理要你做" + task); String result = "做完了"; // 當(dāng)事情做完了我們就通過總經(jīng)理公布的phoneCall方法通知總經(jīng)理結(jié)果 callBack.backResult(result); } }
Main代碼不變,執(zhí)行結(jié)果也是一樣的。
總結(jié)
以上是生活随笔為你收集整理的深入理解Java回调函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浏览器无法显示某些网页或者提示脚本错误的
- 下一篇: 万字长文带你回顾Java集合框架