我有这样一个类
class elem{
List<elem> child ;
.......
 
}
我想实现深度复制,重写clone方法
protected Object clone() throws CloneNotSupportedException {
  // TODO Auto-generated method stub
  Elem e = null;
  e = (Elem)super.clone();
  e.children = new ArrayList<Elem>();
  for(int i=0;i<e.children.size();i++){
   Elem temp = (Elem)children.get(i).clone();
   e.children.add(temp);
  }
  return e;
 }
 我想处理多层嵌套的情况,可是上面那个根本没有起作用。求解决方法。

解决方案 »

  1.   

    protected Object clone() throws CloneNotSupportedException {
      // TODO Auto-generated method stub
      Elem e = null;
      e = (Elem)super.clone();
    if(e.children!=null){
     List<elem> tempList = new ArrayList<Elem>();
      for(int i=0;i<e.children.size();i++){
       Elem temp = (Elem)children.get(i).clone();
       tempList.add(temp);
      }
     e.children = tempList;
    }
      return e;
     }
      

  2.   

    如果所有子子孙孙都是常见的Serializable的话,建议用序列化/反序列化的方式搞定。序列化到内存数组中,再反向读取,返回出来作为超级深度克隆的产物
      

  3.   

    如果效率不是很关键的话, 我会偷懒用(flexjson.jar)
    new JSONDeserializer().deserialize(new JSONSerializer().deepSerialize(object))
      

  4.   


    ===========================
    如果要完全深度复制,还是用objectinputstream/objectoutputstream对象流,处理吧。
      

  5.   

    protected Object clone() throws CloneNotSupportedException {
      Elem e new Elem();
      e.children = new ArrayList<Elem>();
      for (Elem child : this.children) 
        e.children.add(child.clone());
      return e;
     }你的方法里,注意这两行:
      e.children = new ArrayList<Elem>();
      for(int i=0;i<e.children.size();i++){e.children是一个新的ArrayList,所以下面这个循环没有效果
      

  6.   

    用ByteArrayOutputStream和ByteArrayInputStream来读写吧。目测那for循环里也是影子克隆而已,不能达到深度克隆