`
jefferson
  • 浏览: 279710 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

回调的妙用

阅读更多

 

     回调一般在java应用中,于window编程比较多,本人在这方面经验比较少,对回调的应用经验几乎是空白,因此对JAVA的回调技术没什么了解。

     后来也就是在使用hibernate的时候,应用了spring包装的hibnerte 的API类HibernateDaoSupport的时候,在分页查询,应用了Criteria的动态查询,HibernateTemplate支持得不是很好,就用了回调的技术

    

java 代码
  1. public PaginationSupport findPageByCriteria(   
  2.             final DetachedCriteria detachedCriteria, final int page,   
  3.             final int pageSize) {   
  4.         return (PaginationSupport) getHibernateTemplate().execute(   
  5.                 new HibernateCallback() {   
  6.                     public Object doInHibernate(Session session)   
  7.                             throws HibernateException {   
  8.                         Criteria criteria = detachedCriteria   
  9.                                 .getExecutableCriteria(session);   
  10.                         int totalCount = ((Integer) criteria.setProjection(   
  11.                                 Projections.rowCount()).uniqueResult())   
  12.                                 .intValue();   
  13.                         criteria.setProjection(null);   
  14.                         List items = criteria.setFirstResult(page)   
  15.                                 .setMaxResults(pageSize).list();   
  16.                         PaginationSupport ps = new PaginationSupport(items,   
  17.                                 totalCount, pageSize, page);   
  18.                         return ps;   
  19.                     }   
  20.                 }, true);   
  21.     }  

 

         后来看到有关回调技术的说法:

        当通常大家说的回调函数一般就是按照别人的定好的接口规范写的,等待别人调用的函数,在C语言中,回调函数通常通过函数指针来传递;在Java中,通常就是编写另外一个类或类库的人规定一个接口,然后你来实现这个接口,然后把这个实现类的一个对象作为参数传给别人的程序,别人的程序必要时就会通过那个接口来调用你编写的函数。

        最近在研究jive论坛,在搜索的时候它使用了Ietorator,其中就是使用了回调的技术,忽然眼前一亮,至此,才看到回调的妙用。

        看片断,构造函数:

java 代码
  1. public DatabaseObjectIterator(int type, long [] elements,   
  2.            final Object extraObject)   
  3.    {   
  4.        this.elements = elements;   
  5.   
  6.        // Load the appropriate proxy factory depending on the type of object   
  7.        // that we're iterating through.   
  8.        switch (type) {   
  9.            // FORUM   
  10.            case JiveGlobals.FORUM:   
  11.                // Create an objectFactory to load forums.   
  12.                this.objectFactory = new DatabaseObjectFactory() {   
  13.                    ForumFactory factory = (ForumFactory)extraObject;   
  14.   
  15.                    public Object loadObject(long id) {   
  16.                        try {   
  17.                            Forum forum = factory.getForum(id);   
  18.                            return forum;   
  19.                        }   
  20.                        catch (ForumNotFoundException mnfe) { }   
  21.                        catch (UnauthorizedException ue) { }   
  22.                        return null;   
  23.                    }   
  24.                };   
  25.                break;  

      

  1. //THREAD   
  2.            case JiveGlobals.THREAD:   
  3.                // Create an objectFactory to load threads. There are two   
  4.                // possibilities -- the first is that extraObject is a   
  5.                // Forum that we can directly load threads from. The   
  6.                // second is that extraObject is a DbForumFactory. The latter   
  7.                // case can occur when we need to iterate through a set of   
  8.                // threads that come from multiple different forums.   
  9.                if (extraObject instanceof Forum) {   
  10.                    this.objectFactory = new DatabaseObjectFactory() {   
  11.                        Forum forum = (Forum)extraObject;   
  12.   
  13.                        public Object loadObject(long id) {   
  14.                            try {   
  15.                                ForumThread thread = forum.getThread(id);   
  16.                                return thread;   
  17.                            }   
  18.                            catch (ForumThreadNotFoundException tnfe) { }   
  19.                            return null;   
  20.                        }   
  21.                    };   
  22.                }   
  23.                else {   
  24.                    this.objectFactory = new DatabaseObjectFactory() {   
  25.                        DbForumFactory factory = (DbForumFactory)extraObject;   
  26.   
  27.                        public Object loadObject(long id) {   
  28.                            try {   
  29.                                return factory.cacheManager.threadCache.get(id);   
  30.                            }   
  31.                            catch (ForumThreadNotFoundException mnfe) { }   
  32.                            return null;   
  33.                        }   
  34.                    };   
  35.                }   
  36.                break;  

 

  1. //MESSAGE   
  2.            case JiveGlobals.MESSAGE:   
  3.                // Create an objectFactory to load messages. There are two   
  4.                // possibilities -- the first is that extraObject is a   
  5.                // ForumThread that we can directly load messages from. The   
  6.                // second is that extraObject is a DbForumFactory. The latter   
  7.                // case can occur when we need to iterate through a set of   
  8.                // messages that come from multiple different threads.   
  9.                if (extraObject instanceof ForumThread) {   
  10.                    this.objectFactory = new DatabaseObjectFactory() {   
  11.                        ForumThread thread = (ForumThread)extraObject;   
  12.   
  13.                        public Object loadObject(long id) {   
  14.                            try {   
  15.                                ForumMessage message = thread.getMessage(id);   
  16.                                return message;   
  17.                            }   
  18.                            catch (ForumMessageNotFoundException mnfe) { }   
  19.                            return null;   
  20.                        }   
  21.                    };   
  22.                }   
  23.                else {   
  24.                    this.objectFactory = new DatabaseObjectFactory() {   
  25.                        DbForumFactory factory = (DbForumFactory)extraObject;   
  26.   
  27.                        public Object loadObject(long id) {   
  28.                            try {   
  29.                                ForumMessage message =   
  30.                                        factory.cacheManager.messageCache.get(id);   
  31.                                // Now, get the message from its thread so that   
  32.                                // filters are applied to the message.   
  33.                                message = message.getForumThread().getMessage(id);   
  34.                                return message;   
  35.                            }   
  36.                            catch (ForumMessageNotFoundException mnfe) { }   
  37.                            return null;   
  38.                        }   
  39.                    };   
  40.                }   
  41.                break;  

 

  1. //USER   
  2.           case JiveGlobals.USER:   
  3.               // Create an objectFactory to load users.   
  4.               this.objectFactory = new DatabaseObjectFactory() {   
  5.                   UserManager userManager = (UserManager)extraObject;   
  6.   
  7.                   public Object loadObject(long id) {   
  8.                       try {   
  9.                           User user = userManager.getUser(id);   
  10.                           return user;   
  11.                       }   
  12.                       catch (UserNotFoundException unfe) { }   
  13.                       return null;   
  14.                   }   
  15.               };   
  16.               break;   
  17.           //GROUP   
  18.           case JiveGlobals.GROUP:   
  19.               // Create an objectFactory to load groups.   
  20.               this.objectFactory = new DatabaseObjectFactory() {   
  21.                   GroupManager groupManager = (GroupManager)extraObject;   
  22.   
  23.                   public Object loadObject(long id) {   
  24.                       try {   
  25.                           Group group = groupManager.getGroup(id);   
  26.                           return group;   
  27.                       }   
  28.                       catch (GroupNotFoundException gnfe) { }   
  29.                       return null;   
  30.                   }   
  31.               };   
  32.               break;   
  33.           // Otherwise, an invalid value was passed in so throw an exception.   
  34.           default:   
  35.               throw new IllegalArgumentException("Illegal type specified");   
  36.       }   
  37.   }  

定义回调的方法的接口类:

 

 

  1. interface DatabaseObjectFactory {   
  2.   
  3.     /**  
  4.      * Returns the object associated with id or null if the  
  5.      * object could not be loaded.  
  6.      *  
  7.      * @param id the id of the object to load.  
  8.      * @return the object specified by id or null if it could not  
  9.      *      be loaded.  
  10.      */  
  11.     public Object loadObject(long id);   
  12. }  

 

对接口方法的调用

 

java 代码
  1. public Object getNextElement() {   
  2.         while (currentIndex+1 < elements.length) {   
  3.             currentIndex++;   
  4.             Object element = objectFactory.loadObject(elements[currentIndex]);   
  5.             if (element != null) {   
  6.                 return element;   
  7.             }   
  8.         }   
  9.         return null;   
  10.     }  

 

 继续......

分享到:
评论

相关推荐

    关于Javascript回调函数的一个妙用

    其实回调函数简单通俗点就是当有a和b两个函数,当a作为参数传给b,并在b中执行,这时a就是一个回调(callback)函数,如果a是一个匿名函数,则为匿名回调函数那下面们来通过一个实例来具体解释下Javascript回调函数怎么...

    c语言指针的妙用c语言指针的妙用

    这在实现回调函数、排序算法等场景中非常有用。 #### 示例分析 下面通过一个具体的例子来进一步理解指针作为函数参数的应用。 ```c #include // 函数原型声明 void swap(int *x, int *y); int main() { int a...

    二级指针的妙用1

    在本文中,我们将深入探讨二级指针在编程中的妙用,特别是在处理链表数据结构时的高效性。林纳斯·托瓦兹(Linus Torvalds)在他的讨论中强调了理解指针和二级指针的重要性,他认为这是核心底层编程的基础。他指出,...

    RSI在分时中的妙用通达信指标公式源码.doc

    1. **卖出信号**: 当分时图中的RSI1(即14周期的RSI)数值达到75-80时,这表明短期内价格上涨过快,可能面临回调风险,是卖出的好时机。这种情况下,市场可能正处在超买区域,投资者应考虑减仓或平仓。 2. **买入...

    Android中你可能不知道的Fragment妙用

    这种方式虽然通用,但当需要在多个Activity或Fragment中处理登录回调时,代码会变得冗余且难以维护。为了解决这个问题,我们可以利用Fragment的生命周期特性,创建一个专门处理登录回调的Fragment。 具体实现如下:...

    众妙之门 JavaScript与jQuery技术精粹

    同时,深入理解原型链、闭包、异步编程(如回调函数、Promise和async/await)等高级特性也是必不可少的。JavaScript还提供了DOM(文档对象模型)操作,通过它可以改变HTML元素,实现动态更新网页内容。 jQuery,是...

    白色垃圾的妙用.docx

    - **玻璃球**:装饰用的小型玻璃球也可以回收利用。 ### 电热锯的应用 电热锯是一种利用电流通过金属丝发热原理工作的切割工具。它能够将泡沫材料锯切得非常平整,其原因在于: - **加热丝长度长**:较长的加热丝...

    ajaxjune.net

    而我们平时做开发所真正用到的,确没有多少,我们只需要一些基本的Ajax回调技术,当然封装成组件是为了方便使用,如果能灵活调用方法那更妙,告诉你,这些在ajaxjune.net里面都已实现,包括table数据回调。

    android开发中ListView的妙用之:下拉刷新与到底部载入更多

    4. **更新数据并同步视图**:在后台线程中完成数据刷新,然后回调主线程更新ListView的数据集并调用Adapter的notifyDataSetChanged()方法。 二、到底部加载更多(Infinite Scrolling) 加载更多功能则允许用户滚动...

    jQuery $.get 的妙用 访问本地文本文件

    URL 是要请求的资源地址,回调函数则会在请求成功时被调用,返回的数据会作为参数传递给这个函数。例如: ```javascript $.get('Scripts/data.txt', function(content) { // content 将包含 data.txt 文件的文本...

    js中setTimeout的妙用–防止循环超时

    为了解决这类问题,我们可以利用异步编程的策略,即通过延迟执行和回调来避免阻塞主线程。 对于向服务器发送请求,通常我们会使用AJAX(异步JavaScript和XML)来实现异步通信,等待请求响应后执行回调函数。而对于...

    JavaScript中的this妙用实例分析

    - 确保理解当前`this`的指向,特别是在回调函数、事件处理函数以及对象方法中,其指向可能与直觉不同。 - 在回调函数中,如果希望`this`指向特定对象,可以通过`call()`、`apply()`或`bind()`方法来指定。 - 在严格...

    详解AngularJS脏检查机制及$timeout的妙用

    这时,我们可以在$timeout的回调函数中调用$scope.$apply来确保视图得到更新。 总结来说,AngularJS的脏检查机制是其MVVM模式的核心。它通过监视数据变化来实现数据和视图的同步更新,极大地简化了Web应用的状态...

    JavaScript定时器实现的原理分析

    下面将详细分析JavaScript定时器的实现原理、妙用以及使用时需注意的事项。 一、储备知识 在JavaScript中,常用的两种定时器分别是setTimeout和setInterval。setTimeout函数用于设置一个定时器,这个定时器会在...

    Javascript中关于Array.filter()的妙用详解

    前言 和map类似,Array的filter也接收一个函数。但是和map不同的是, filter把传入的函数依次作用于每个元素,然后根据返回值是 true 还是false决定保留还是丢弃该元素。 实例介绍 例如,在一个Array中,删掉偶数,...

    十拿九稳.doc

    他的方法是利用“区间涨跌幅度”工具,在通信功能报价中筛选出强于大盘的股票,并通过历史数据分析,确定那些回调幅度不超过20%的股票,以此来减少投资风险。金宝的策略更倾向于技术分析,通过对股价波动和均线的...

Global site tag (gtag.js) - Google Analytics