Java clone()方法是实现多态克隆的唯一方法吗?

Pos*_*osa 6 java clone deep-copy cloneable

我需要我的装备多态克隆(深层副本)类,即我需要的是这样的工作:

SuperType original = new SubType();
SuperType copy = original.clone();
Run Code Online (Sandbox Code Playgroud)

其中original.clone()可以用任何机制代替创建深层副本,而实际类型copy应该是SubType,因为original它也是一个SubType.

clone()方法和Cloneable接口,实现这一目标的唯一途径?工厂方法和拷贝不能被用来构造函数,因为实际的类仅在运行时已知的,对不对?除了那些序列化 - 反序列化方法之外还有其他任何建议的方法,而Java深度克隆库是恕我直言的黑魔法甚至比clone()方法更糟糕吗?

谢谢,彼得

dce*_*chi 4

实际上,Object 的clone()方法不允许您进行任何多态调用,因为 is protected。实现Cloneable也是没有用的,因为它不包含clone()方法。

您可以通过为克隆的类提供多态方法(依次调用复制构造函数)来进行多态克隆。

abstract class SuperType {
    public SuperType(SuperType t) {
    }

    public abstract SuperType deepCopy();
}

class SomeType extends SuperType {

    SomeType(SomeType t) {
        //copy constructor
    }

    @Override
    public SomeType deepCopy() {                        
        return new SomeType(this);
    }
}

 ...

SuperType original = new SubType();
SuperType copy = original.deepCopy(); //the deepCopy is called on children classes
Run Code Online (Sandbox Code Playgroud)

也可以看看:

Joshua Block 对克隆与复制构造函数的看法