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

          先聲明一個回調(diào)接口,算法函數(shù)直接調(diào)用這些接口來獲取數(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ù)對象數(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看似語法有點(diǎn)怪,實(shí)際上卻相當(dāng)簡潔實(shí)用,你只要把它視作是實(shí)現(xiàn)了ObjForJSON接口的一個類就可以了,只不過它是內(nèi)部聲明的,沒有名字而矣。另外,最方便的是你可以在inner class里訪問外層函數(shù)的本地變量,以及外層類的成員,大大方便數(shù)據(jù)處理。

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


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

          評論:
          # re: 用匿名inner class方便的在JAVA里實(shí)現(xiàn)callback功能 2008-05-17 11:01 | 山風(fēng)小子
          closure in disguise :)  回復(fù)  更多評論
            
          # re: 用匿名inner class方便的在JAVA里實(shí)現(xiàn)callback功能 2008-05-17 22:13 | 我愛佳娃
          TIJ3里曾經(jīng)寫過an inner class is an object-oriented closure,這種方式將單純的回調(diào)方法擴(kuò)展正“回調(diào)對象”。
          另外,closure的語法太不平易近人,我倒是覺得匿名inner class的語法挺像JAVASCRIPT里“在調(diào)用處定義”,一眼能看清楚它都干了些啥。  回復(fù)  更多評論
            
          # re: 用匿名inner class方便的在JAVA里實(shí)現(xiàn)callback功能 2013-06-03 14:45 | Mr.楊
          好復(fù)雜 直接看不懂啊   回復(fù)  更多評論
            
          主站蜘蛛池模板: 朝阳市| 长丰县| 天柱县| 朝阳县| 黎川县| 缙云县| 桐乡市| 呼图壁县| 托克逊县| 六盘水市| 名山县| 沈阳市| 扎囊县| 达尔| 连云港市| 绥宁县| 油尖旺区| 高邮市| 绥芬河市| 寻乌县| 蓝山县| 黔南| 阿拉尔市| 根河市| 招远市| 海伦市| 牙克石市| 顺义区| 永善县| 金沙县| 瑞安市| 灵寿县| 宁远县| 邮箱| 天全县| 河间市| 大埔县| 呼和浩特市| 上林县| 卢湾区| 都江堰市|