WEB開發 de 點滴

          by sanwish

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            38 隨筆 :: 0 文章 :: 4 評論 :: 0 Trackbacks

          何為具備clone條件的并且有必要clone的成員進行逐一clone?比如,原生類型(primitive type),定為瞬態(Transient)的類型,不可訪問的類型(!Field#isAccessible()),沒實現Cloneable接口的類型等等,都不具備clone條件。String等java定義的類型就不需要再深入clone了,這些屬于沒必要進行clone的情況。但List類型等 “容器”類是有必要clone的成員類型。

          據此,遞歸程序示意如下(deepClone為java 方法):

          /**

          * @return Object 返回clone的對象

          * @param obj 原對象

          * @param length clone的深度

          */

          public Object deepClone(Object obj, int length) {

          Object result = obj;

          //此處為偽代碼: 如果對象obj不具備clone條件,就返回result,這也是遞歸的結束條件。

          //此處為偽代碼: 如果對象obj沒必要clone,就返回result

          //此處為偽代碼:開始進行“clone”對象。這地方是調一個抽象方法來處理,這樣可以增加很多靈活性。該方法主要目的是實現“clone”對象方案。注意:這里面的“clone”方案可能是我們想都想不到的方案,它可能有很多創意,但效果都是一樣的,就是要“clone”個新的對象出來。當然最容易想的就是Object#clone()方法了。示意如下:

          result = om.clone(obj);

          //此處為偽代碼: 獲取具備clone條件的并且有必要clone的所有成員。這地方也是調一個抽象方法來處理。同樣是為了增強靈活性。獲取這些成員的方法有很多,可能是通過setter和getter對來得到,也可能是通過get fields 等等方法得到(這種方法可能不少成員是無法直接訪問的,往往需要結合別的方法),甚至是多種方法的綜合??傊?,目的只有一個,就是獲得這些成員。

          for (int i = 0; i < fields.length; i++) {

          //對成員進行處理

          //如果已不需要再判斷成員了,那除了“容器”成員外,已經clone結束

          if (length <= 1) {

          if (!“容器”成員) {

          continue;

          }

          try {

          //只需clone一次了,注意遞歸方法的深度參數傳入1

          clonedFieldValue = deepClone(“容器”成員的值, 1);

          } catch (Exception ex2) {

          ex2.printStackTrace();

          return result;

          }

          } else {

          try {

          clonedFieldValue = deepClone(成員的值, length - 1);

          } catch (Exception ex) {

          ex.printStackTrace();

          return result;

          }

          }

          try {

          //此處為偽代碼:將clone好的值(clonedFieldValue)設進去

          } catch (Exception ex) {

          ex.printStackTrace();

          return result;

          }

          }//for..

          return result;

          }

          至此,已完成了“N深clone”。下面討論一下別的相關問題。比如說這種深度clone原本是 A-->B-->C--……-->xz這樣一種情況,就是說A類含有B成員,B里面又含有C成員,依此類推。如果想在“N深 clone”時,只clone“xz”這個成員怎么辦?其實很簡單,這個問題主要是要解決在遞歸過程中有些成員需要clone同時有些成員不需clone 仍保留引用這個問題。在上面的遞歸示例中已經提到,實現“clone”的“方案”已經被定義成抽象方法,那么我們只要對這個方法做一個滿足這個需求的實現即可。

          posted on 2008-11-07 11:07 sanwish 閱讀(132) 評論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 托克逊县| 彭泽县| 康定县| 开阳县| 社会| 德兴市| 柘荣县| 徐闻县| 西乡县| 大竹县| 上林县| 敖汉旗| 西藏| 潞西市| 嘉善县| 呼图壁县| 普安县| 吉水县| 垣曲县| 中江县| 西华县| 屯留县| 南丰县| 镇坪县| 崇阳县| 息烽县| 藁城市| 芦溪县| 海口市| 青海省| 滨州市| 武冈市| 斗六市| 高雄市| 梨树县| 苏尼特右旗| 兖州市| 开化县| 五常市| 治多县| 嘉黎县|