代码之家  ›  专栏  ›  技术社区  ›  setzamora

用Java克隆对象[3个问题]

  •  0
  • setzamora  · 技术社区  · 14 年前

    abstract class Top extends TopMost {
        protected Object clone() {
            Object obj = super.clone();
            // deep copy and try catch
        }
    
    
    }
    
    abstract class A extends Top { 
        protected Object clone() {
            Object obj = super.clone();
           // deep copy and try catch
        } 
    
    
    }
    
    class Asub extends A {
        protected Object clone() {
            Object obj = super.clone();
            // deep copy and try catch
        }
    
        public void doSomethingNew() {
        }
    }
    
    abstract class TopMost {
        public void someMethod() {
            Top a = (Top) super.clone();
            // more code here
        }
    }
    
    public class Main {
        public static void main(String... args) {
            Asub class1 = new Asub();
            class1.someMethod();
        }
    }
    
    3 回复  |  直到 14 年前
        1
  •  1
  •   Buhake Sindi Tesnep    14 年前

    允许所有人 abstract 子类实现 super.clone() Object.clone() 方法。

    我的建议是允许所有具体类(比如ASub)重写clone方法并使用 copy constructor 创造一个自己的精确克隆。。。。

    例如

    public abstract class TopMost {
    
        public TopMost(TopMost rhs) {
    
        }
    
    }
    
    public abstract class Top extends TopMost {
    
        public Top(Top rhs) {
            super(rhs);
    
            //whatever you need from rhs that only is visible from top
        }
    }
    
    public abstract class A extends Top { 
    
        public A (A rhs) {
            super(rhs);
    
            //TODO: do rhs copy
        }
    }
    
    public class ASub extends A {
    
        public ASub(ASub rhs) {
            super(rhs);
    
            //TODO: copy other stuff here....
        }
    
        public Object clone() {
            return new ASub(this);
        }
    }
    

    附言 制造 TopMost

        2
  •  3
  •   Community Neeleshkumar S    7 年前

    首先,请注意 the clone() interface is broken ,因此不应在新代码中使用。最好是 .

    需要这样做,正确的方法是 TopMost 实施 Cloneable

    那是什么呢 可克隆的 如果它不包含任何方法,你会这样做吗?它决定 Object s受保护 clone 实现:如果类实现 可克隆的 , 对象 s clone方法返回对象的逐字段副本; CloneNotSupportedException 这是一种非常不典型的用法 的接口,而不是一个要仿真的接口。通常,实现一个接口 说明类可以为其客户机做些什么。如果是 可克隆的 ,

    此外, Asub.clone public ,不是 protected Asub克隆 返回 Asub ,不是 (对于它的超类也是如此)。

    在类中不显示任何成员-的实现 克隆 在不同的类中,根据该类中成员的类型,可以有很大的不同。也就是说,如果一个类有任何可变成员,则需要小心地深度复制所有成员,否则最终会导致不同的对象共享其内部状态。

    克隆 抽象类中的方法,所有这些方法都只调用 super.clone() -你和我一起生活会更好 Asub.clone() 只是。

    作为旁注,如果 Top a = (Top) super.clone() 不是一个拼写错误,您引入了一个从基类到派生类的依赖关系,这不是一个好主意。

        3
  •  0
  •   gpeche    14 年前

    super.clone() 禁用虚拟机制,因此它只调用 Object.clone()