spring使用了大量的回呼函數,如HibernateCallBack,開啟你的eclipse,ctrl+shift+t,再輸入*CallBack,你可以看到有多少地方在使用回呼函數,下面分析一下大牛們為什麼頻繁使用這個CallBack函數。
廢話少說,先來個例子說事兒。
package com.lixuehui.callbacktest;</p><p>public interface MySession {<br /> public Object createMyQuery();<br />}</p><p>package com.lixuehui.callbacktest;</p><p>public class MySessionImpl implements MySession{<br /> public Object createMyQuery(){<br /> return "Hello,World!";<br /> }<br />}</p><p>package com.lixuehui.callbacktest;</p><p>public interface MyHibernateCallBack {<br /> Object doInHibernate(MySession target);<br />}</p><p>package com.lixuehui.callbacktest;</p><p>abstract class MyTemplete{<br /> protected MySession createSession(){<br /> return new MySessionImpl();// 類比建立一個session<br /> }</p><p> protected Object execute(MyHibernateCallBack callback){<br /> MySession mySession = createSession(); // 類比建立一個session<br /> Object object = callback.doInHibernate(mySession);<br /> return object;<br /> }<br />}</p><p>class TempClass implements MyHibernateCallBack {<br /> public Object doInHibernate(MySession session) {<br /> return session.createMyQuery();<br /> }<br />}</p><p>public class Test extends MyTemplete{</p><p> public static void main(String[] args) {<br /> Object object = new Test().execute(new MyHibernateCallBack(){<br /> //這處new這個介面,建立一個匿名內部類,相當於new了一個實現MyHibernateCallBack介面的類,然後再將這個匿 名對象傳給execute方法。<br /> public Object doInHibernate(MySession session){<br /> return session.createMyQuery();<br /> }<br /> });<br /> System.out.println(object);<br /> }<br />}<br />//Test類相當於:<br />public class Test extends MyTemplete {</p><p> public static void main(String[] args){<br /> TempClass temp = new TempClass();<br /> Object object = new Test().execute(temp);<br /> System.out.println(object);<br /> }<br />}</p><p>
不過這麼寫靈活度比較低,doInHibernate裡的如果做另外的操作的話,就要重複修改TempClass的doInHibernate方法。
看到回調的好處了嗎?
我覺得這個回調的好處是:
通過建立匿名類,動態實現介面,並實現介面的方法,側重點在於介面,不在乎實現介面的類,故採用匿名類。
如果你遇到了側重點在於介面,而不在乎類實現的情況,就可以採取這種回調方式。
Oberser,swing的事件機制,以及java裡的自訂事件機制,頻繁用的都是回調.
包括java裡的main函數,也可以理解為回調
那想想,為什麼java *** 的時候就必須走main方法中呢,可見java ***的時候內部也是回調用的main,所以才跑到main方法裡.main方法扔給二次開發人員,隨意施展.
回調,回調,顧名思義:"你先實現吧,實現完了回頭我調你".