Java中的回调

来源:互联网 发布:1.12数据库 编辑:程序博客网 时间:2024/05/12 22:18

前段时间在学Hibernate的时候看了一下Spring中的对Hibernate的包装,其中的HibernateTemplate类中使用了execute(HibernateCallback action)来实际做各种Hibernate操作,其中HibernateCallback是一个用来回调的接口
      public interface HibernateCallback{
 Object doInHibernate(Session session) throws HibernateException,SQLException;
 }

这样各种不同的操作都可以通过实现自己的HibernateCallback接口来做,如save:
     public void save(final Object entity, final Serializable id) throws DataAccessException  {
  execute(new HibernateCallback() {
   public Object doInHibernate(Session session) throws  HibernateException {
    session.save(entity, id);
    return null;
   }
  });
 }


excute函数大概如下:
public Object execute(HibernateCallback action) throws DataAccessException {
.......
try {
   Object result = action.doInHibernate(session);
   flushIfNecessary(session, existingTransaction);
   return result;
  }
.........
}


JAVA中的回调大致就是定义一个interface,而调用者不需要知道这个interface的具体实现,只需要调用接口函数就可以。在上面Spring的例子中是用Inner class来把接口的实现传给调用者的,如果不是Inner class,那就需要把接口具体实现的引用传给调用者。如think in java中的例子:
//回调接口
public interface FilenameFilter {
          boolean accept(File dir, String name);
      }
//接口实现
class DirFilter implements FilenameFilter {
        private String afn;
        public DirFilter(String afn){
            this.afn = afn;
        }   
        public boolean accept(File dir, String name){
            String f = new File(name).getName();
            return f.indexOf(afn) != -1;
        }
    }
//调用的方法
       public String[] list(FilenameFilter filter)
//实际调用
      String[] list = file.list(new DirFilter("wf"));


这只是我看的JAVA中的回调,在软件模块调用关系中回调指的是:回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口 (参见http://www-900.ibm.com/developerWorks/cn/linux/l-callback/index.shtml )
套用到上面java的例子好象都没成立,被调用者都没有在接口被调用时也会调用对方的接口,可能这是回调机制和回调函数的区别吧?
在JAVA中实现回调机制也是可以的,比如在多线程程序中,子线程可以调用主线程中的某个函数来发送某些消息给主线程。这个例子在Java Network Programming 2nd的125页中有,这里只写点片段:
子线程:
public class CallbackDigest implement Runable{
....
public void run(){
...
CallbackDigestUserInterface.receiveDigest(..);
...
}
....
}

而在主程序中有:
public class CallbackDigestUserInterface{
...
public static void receiveDigest(){
........
}
...
}

了解了回调再去看Command模式就轻松的多 :)
http://www.jdon.com/designpatterns/command.htm 
http://www.javaworld.com/javaworld/javatips/jw-javatip68.html 

原创粉丝点击