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;

    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值