java回調方法

最近被人問到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;

    }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章