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

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

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

    隨筆-124  評(píng)論-194  文章-0  trackbacks-0
    回調(diào)函數(shù)是相當(dāng)有用,它的意義不僅可以讓調(diào)用者控制調(diào)用函數(shù)的執(zhí)行,還可以有效的將“算法”與“數(shù)據(jù)”分離,將涉及數(shù)據(jù)的部分放入回調(diào)接口(inner class)中,算法就會(huì)相對(duì)獨(dú)立。下面是一個(gè)示例。

    先聲明一個(gè)回調(diào)接口,算法函數(shù)直接調(diào)用這些接口來(lái)獲取數(shù)據(jù):
    /**
     * 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; 
    }

    算法函數(shù),根據(jù)對(duì)象數(shù)據(jù),進(jìn)行一些邏輯處理,將集合變成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回調(diào)類為參數(shù),調(diào)用算法函數(shù):
            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看似語(yǔ)法有點(diǎn)怪,實(shí)際上卻相當(dāng)簡(jiǎn)潔實(shí)用,你只要把它視作是實(shí)現(xiàn)了ObjForJSON接口的一個(gè)類就可以了,只不過(guò)它是內(nèi)部聲明的,沒(méi)有名字而矣。另外,最方便的是你可以在inner class里訪問(wèn)外層函數(shù)的本地變量,以及外層類的成員,大大方便數(shù)據(jù)處理。

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


    posted on 2008-05-16 19:19 我愛(ài)佳娃 閱讀(2651) 評(píng)論(3)  編輯  收藏 所屬分類: JAVA基礎(chǔ)

    評(píng)論:
    # re: 用匿名inner class方便的在JAVA里實(shí)現(xiàn)callback功能 2008-05-17 11:01 | 山風(fēng)小子
    closure in disguise :)  回復(fù)  更多評(píng)論
      
    # re: 用匿名inner class方便的在JAVA里實(shí)現(xiàn)callback功能 2008-05-17 22:13 | 我愛(ài)佳娃
    TIJ3里曾經(jīng)寫過(guò)an inner class is an object-oriented closure,這種方式將單純的回調(diào)方法擴(kuò)展正“回調(diào)對(duì)象”。
    另外,closure的語(yǔ)法太不平易近人,我倒是覺(jué)得匿名inner class的語(yǔ)法挺像JAVASCRIPT里“在調(diào)用處定義”,一眼能看清楚它都干了些啥。  回復(fù)  更多評(píng)論
      
    # re: 用匿名inner class方便的在JAVA里實(shí)現(xiàn)callback功能 2013-06-03 14:45 | Mr.楊
    好復(fù)雜 直接看不懂啊   回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 亚洲精品视频在线观看视频| 成人免费一区二区无码视频| 在线观看亚洲AV日韩A∨| 综合亚洲伊人午夜网 | 好吊色永久免费视频大全| 亚洲xxxx18| 亚洲一区二区三区久久久久| 亚洲日韩一页精品发布| 久久亚洲色一区二区三区| 亚洲精品乱码久久久久66| 亚洲视频精品在线| 亚洲AV无码乱码国产麻豆穿越| 久久久久久亚洲av成人无码国产| 国产av天堂亚洲国产av天堂| 亚洲AV成人一区二区三区AV| 亚洲成A∨人片在线观看无码| 亚洲人成7777| 美女被免费网站在线视频免费| 人成午夜免费大片在线观看| 中文字幕在线免费观看视频| 88av免费观看入口在线| 日韩免费福利视频| 久久精品国产69国产精品亚洲| 亚洲国产一区二区三区青草影视| 亚洲春黄在线观看| 国产AV无码专区亚洲AV蜜芽 | 亚洲电影在线播放| 羞羞的视频在线免费观看| 精品国产污污免费网站aⅴ| 亚洲国产中文字幕在线观看| mm1313亚洲精品国产| 中国在线观看免费高清完整版 | 亚洲福利视频一区二区| 亚洲av无码偷拍在线观看| 免费无码AV片在线观看软件| 18亚洲男同志videos网站| 韩国免费A级毛片久久| 免费一级做a爰片久久毛片潮喷| 亚洲日韩AV一区二区三区中文| 最近中文字幕mv免费高清在线 | 色天使色婷婷在线影院亚洲|