<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-124  評論-194  文章-0  trackbacks-0
    回調函數是相當有用,它的意義不僅可以讓調用者控制調用函數的執行,還可以有效的將“算法”與“數據”分離,將涉及數據的部分放入回調接口(inner class)中,算法就會相對獨立。下面是一個示例。

    先聲明一個回調接口,算法函數直接調用這些接口來獲取數據:
    /**
     * an inner callback interface for getting object data
     
    */

    public interface ObjForJSON {
        String getName (Object o);
        String getId (Object o);
        
    void putJSONData (Object o, JSONObject js) throws JSONException; 
    }

    算法函數,根據對象數據,進行一些邏輯處理,將集合變成JSON格式的字串:
        /**
         * iterator a set of objects, invoking its interfaces for format JSON set string
         * 
    @param setName set name in XML element
         * 
    @param iter set iterator object
         * 
    @param e XML element
         * 
    @param ctx context of DB
         * 
    @param obj an inner callback class for getting object data
         
    */

        
    static public void setToJSON(String setName, Iterator iter, Element e, ManagerContext ctx, ObjForJSON obj) {
            Field2Attr f2a 
    = ctx.getF2a();

            String setStr 
    = XmlHelper.getValue(e, setName, ctx);
            logger.debug(
    "before add {}", setStr);

            
    try {
                
    // create JSON from exist string
                JSONObject setJson;
                
    if (setStr != null && setStr.length() > 0)
                    setJson 
    = new JSONObject(setStr);
                
    else
                    setJson 
    = new JSONObject();

                
    while (iter.hasNext()) {
                    Object o 
    = iter.next();
                    
                    
    // test if this object exists in array
                    if (!setJson.has(obj.getName(o))) {
                        
    // if not exist, I'll add it to array
                        JSONObject jo = new JSONObject();
                        obj.putJSONData(o, jo);

                        setJson.put(obj.getName(o), jo);
                        logger.debug(
    "add obj {}", obj.getId(o));
                    }

                }


                
    // set it to output element
                XmlHelper.replaceValue(e, setName, setJson.toString(), ctx);

                logger.debug(
    "obj set is {}", setJson.toString());
            }
     catch (JSONException e1) {
                
    // TODO Auto-generated catch block
                e1.printStackTrace();
            }

        }
        


    用inner class回調類為參數,調用算法函數:
            JSONHelper.setToJSON(f2a.HOST_SERVICES, o.getServices().iterator(), e, ctx, new ObjForJSON() {
                
    public String getId(Object obj) {
                    
    return ((Service) obj).getId().toString();
                }


                
    public String getName(Object obj) {
                    
    return ((Service) obj).getName();
                }


                
    public void putJSONData(Object obj, JSONObject js) throws JSONException {
                    Service s 
    = (Service) obj;
                    js.put(
    "id", s.getId());
                    js.put(
    "n", s.getName());
                    js.put(
    "pid", o.getId());
                    js.put(
    "p", o.getName());
                }

            }
    );


    上面的匿名inner class看似語法有點怪,實際上卻相當簡潔實用,你只要把它視作是實現了ObjForJSON接口的一個類就可以了,只不過它是內部聲明的,沒有名字而矣。另外,最方便的是你可以在inner class里訪問外層函數的本地變量,以及外層類的成員,大大方便數據處理。

    上例中,由于使用回調inner class,可以針對多種對象執行算法函數,而不必要求待處理的對象去實現特定接口。更有些情況下,還必須使用回調才顯得合理。


    posted on 2008-05-16 19:19 我愛佳娃 閱讀(2644) 評論(3)  編輯  收藏 所屬分類: JAVA基礎

    評論:
    # re: 用匿名inner class方便的在JAVA里實現callback功能 2008-05-17 11:01 | 山風小子
    closure in disguise :)  回復  更多評論
      
    # re: 用匿名inner class方便的在JAVA里實現callback功能 2008-05-17 22:13 | 我愛佳娃
    TIJ3里曾經寫過an inner class is an object-oriented closure,這種方式將單純的回調方法擴展正“回調對象”。
    另外,closure的語法太不平易近人,我倒是覺得匿名inner class的語法挺像JAVASCRIPT里“在調用處定義”,一眼能看清楚它都干了些啥。  回復  更多評論
      
    # re: 用匿名inner class方便的在JAVA里實現callback功能 2013-06-03 14:45 | Mr.楊
    好復雜 直接看不懂啊   回復  更多評論
      
    主站蜘蛛池模板: 国产色爽免费视频| 亚洲色图视频在线观看| 99久久久国产精品免费牛牛 | 99亚洲精品高清一二区| 成年在线观看网站免费| 日本一区二区在线免费观看| 亚洲熟妇中文字幕五十中出| 国产精品免费精品自在线观看| 无码天堂va亚洲va在线va| 亚洲AV成人片色在线观看| 青草草在线视频永久免费| 中国毛片免费观看| 亚洲中文字幕久久精品无码A| 久久久久无码专区亚洲av| 免费人成网站在线观看10分钟| jizz免费在线观看| 亚洲中字慕日产2021| 亚洲综合av永久无码精品一区二区| 日韩国产免费一区二区三区| 国产日韩AV免费无码一区二区三区 | 免费一级毛片正在播放| 麻豆成人久久精品二区三区免费| 色偷偷亚洲男人天堂| 青青草原精品国产亚洲av| 亚洲精品岛国片在线观看| 免费国产成人高清在线观看网站 | 四虎永久在线精品视频免费观看| 最近免费字幕中文大全视频| 国产免费高清69式视频在线观看 | 成全视成人免费观看在线看| 亚洲精品无码人妻无码| 亚洲精品美女视频| 亚洲啪啪AV无码片| 免费中文字幕一级毛片| 夜夜嘿视频免费看| 久草视频在线免费| 最刺激黄a大片免费网站| 免费黄网站在线看| 你懂的在线免费观看| 一级成人生活片免费看| 国产精品亚洲精品日韩动图|