最近被人問到java實現回調方法的問題,我有點迷惑。
向來,比較熟悉的是js中ajax的回調,也只侷限於用,沒有去細較。
維基百科中解釋回調函數:在計算機程序設計中,回調函數,或簡稱回調(Callback 即call then back 被主函數調用運算後會返回主函數),是指通過函數參數傳遞到其它代碼的,某一塊可執行代碼的引用。這一設計允許了底層代碼調用在高層定義的子程序。
這裏的引用,一般情況會是一個函數或者方法,但是java中方法不能作爲參數來傳遞。所以可以通過構造方法或者set方法來傳遞對象。
搜索一下,網上有人這樣解釋:所謂回調,就是客戶程序C調用服務程序S中的某個函數A,然後S又在某個時候反過來調用C中的某個函數B,對於C來說,這個B便叫做回調函數。這個是相對比較容易理解的。
以下代碼來自:http://www.cnblogs.com/wangchenyang/archive/2011/08/16/2140744.html
使用技巧:
定一個接口,在接口中聲明我們想調用的方法。
在另一個方法中註冊剛定義的回調接口
第一步:定義回調接口
package com.callback;
/**
* @since 2012-02-02
* @desc 定義回調接口
*/
public interface CallBackInterface {
public void doSome();
public void exectueMethod();
}
package com.callback;
/**
* @since 2012-02-02
* @desc 李四
*/
public class MethodB {
public double getTime(CallBackInterface callBack) {
long start = System.currentTimeMillis();
callBack.exectueMethod();
long end = System.currentTimeMillis();
System.out.println("cost time=" + (end - start));
return end - start;
}
}
第三步:張三實現李四規定的接口
package com.callback;
/**
* @since 2012-02-02
* @desc 張三
*/
public class MethodA {
public static void main(String args[]){
MethodB b=new MethodB();
//返回值d只和MethodB有關,和接口中方法的返回值無關
double d=b.getTime(new CallBackInterface() {
//張三實現了李四定義的接口
public void exectueMethod() {
new MethodA().testMethod();
}
@Override
public void doSome() {
}
});
System.out.println("d="+d);
}
public void testMethod(){
for(int i=0;i<10000;i++){
System.out.print("");
}
}
}
輸出結果:
cost time=31
d=31.0
突然想到hibernate中有這樣一個類HibernateCallback實現了回調功能。(知識的掌握不牢固吶)
如下:
Hibernate的複雜用法HibernateCallback
HibernateTemplate還提供一種更加靈活的方式來操作數據庫,通過這種方式可以完全使用Hibernate的操作方式。
HibernateTemplate的靈活訪問方式是通過如下兩個方法完成:
(1)Object execute(HibernateCallback action)
(2)List execute(HibernateCallback action)
這兩個方法都需要一個HibernateCallback的實例,HibernateCallback實例可在任何有效的Hibernate數據訪問中使用。
程序開發者通過HibernateCallback,可以完全使用Hibernate靈活的方式來訪問數據庫,解決Spring封裝Hibernate後靈活性不足的缺陷。
HibernateCallback是一個接口,該接口只有一個方法doInHibernate(org.hibernate.Session session),
該方法只有一個參數Session。通常,程序中採用實現HibernateCallback的匿名內部類來獲取HibernateCallback的實例,
方法doInHibernate的方法體就是Spring執行的持久化操作。
public List findByPage(final String hql, final int offset, final int pageSize)
{
//通過一個HibernateCallback對象來執行查詢
List list = getHibernateTemplate()
.executeFind(new HibernateCallback()
{
//實現HibernateCallback接口必須實現的方法
public Object doInHibernate(Session session)
throws HibernateException, SQLException
{
//執行Hibernate分頁查詢
List result = session.createQuery(hql)
.setFirstResult(offset)
.setMaxResults(pageSize)
.list();
return result;
}
});
return list;
}