隨筆-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 我愛佳娃 閱讀(2651) 評論(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.楊
          好復雜 直接看不懂啊   回復  更多評論
            
          主站蜘蛛池模板: 理塘县| 玛多县| 安泽县| 当阳市| 双城市| 宁陕县| 鄂伦春自治旗| 汉中市| 香河县| 庐江县| 榕江县| 会理县| 六枝特区| 河东区| 鄯善县| 金昌市| 凭祥市| 冷水江市| 平原县| 嘉定区| 东山县| 碌曲县| 巫溪县| 平舆县| 深州市| 沂水县| 辽阳市| 雷山县| 武乡县| 綦江县| 东城区| 吉水县| 喀喇| 华安县| 错那县| 基隆市| 商都县| 郑州市| 临高县| 秭归县| 中牟县|