分享 常涛 常涛的分享 当前分享 返回分享首页» 分享 java回调函数

1) 什么是回调?(What)

精妙比喻:我把手机号码给你,你通过手机号码联系我。

具体解释:
我把我的手机号码给你,你通过电话号码打电话 联系我。
我把我的手机号码给你,你通过电话号码发短信 联系我。

共同的部分:
我把我的手机号码给你,你通过电话号码(****)联系我。

不同的部分
(****)每次在使用的时候,选择是打电话或是发短信。


2) 使用java如何实现回调?(How)

 

Java代码

/**
 * 包含有回调方法的类
 */
public class  CallMe {
 
 public void call(CallBack callBack){ // 参数是CallBack接口类型
  System.out.print("我把我的手机号码给你,你通过电话号码");
  
  callBack.execute(); // 回调,不同部分(****),即打电话 OR 发短信

  System.out.print("联系我!");
 }
}

/**
 * 回调接口
 */
interface CallBack {
 void execute();
}

/**
 *  使用回调的类
 *      “打电话”
 */
public class  CallUp {

 public static void main(String[] args) {
  CallMe callMe = new CallMe();

  callMe.call(new CallBack(){
   public void execute(){
    System.out.print("  打电话  ");
   }
  });

 }
} /* !!!  OutPut : ~
我把我的手机号码给你,你通过电话号码  打电话  联系我!

/**
 *  “发短信”
 */
public class  SendMessage {

 public static void main(String[] args) {
  CallMe callMe = new CallMe();
  
  // 创建一个实现CallBack的匿名内部类
  // 通过new表达式返回的引用自动向上转型为对CallBack的引用。
  CallBack callBack = new  CallBack(){
        public void execute(){
         System.out.print("  发短信  ");
        }
       };

  callMe.call(callBack);
 }
} // !!!  OutPut : ~

3) 回调都做了什么?
将变动与不变的代码分离,变动的代码在每次使用时确认。

4) 什么情况使用回调?为什么要使用回调? (Why)
步骤固定,但有一部分内容只有在使用的时候才能知道。

5)不用回调,实现同样同能还有其他方式吗?(Why)

 

6)其他地方使用回调?

 

  6.1 Spring框架中HibernateTemplate类中通过回调获取Session。HibernateTemplate部分源码:

 

/*
            Spring框架HibernateTemplate类部分源码
*/

//  HibernateTemplate.java,仅execute方法。伪码
public <T> T execute(HibernateCallback<T> action) throws DataAccessException {
 return doExecute(action, false, false);
}

protected <T> T doExecute(HibernateCallback<T> action, boolean enforceNewSession, boolean enforceNativeSession)
  throws DataAccessException {
 // ...
 // 这里使用'回调'
 T result = action.doInHibernate(sessionToExpose);
 // ... 
}


// HibernateCallback.java  回调接口
public interface HibernateCallback<T> {
 T doInHibernate(Session session) throws HibernateException, SQLException;
}

/*
           使用HibernateTempalte的execute方法
*/

public static void main(String[] args){
 // ...
   hibernateTemplate.execute(new HibernateCallback(){
       public Object doInHibernate(Session session)
                   throws HibernateException, SQLException {
     // 直接使用session进行操作
     session.createQuery(queryString);
       }
   });
 // ...
}

注: java回调具体名字,有的说是java回调函数,java回调机制(不知道这种说法对不对),本文统一使用“java回调”。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值