用Java克隆子类

ccl*_*eve 6 java clone subclass

我需要在Java中克隆一个子类,但是在代码发生这种情况时,我不会知道子类类型,只知道超类.这样做的最佳设计模式是什么?

例:

class Foo {
    String myFoo;
    public Foo(){}
    public Foo(Foo old) {
        this.myFoo = old.myFoo;
    }
}

class Bar extends Foo {
    String myBar;
    public Bar(){}
    public Bar(Bar old) {
        super(old); // copies myFoo
        this.myBar = old.myBar;
    }
}

class Copier {
    Foo foo;

    public Foo makeCopy(Foo oldFoo) {

        // this doesn't work if oldFoo is actually an
        // instance of Bar, because myBar is not copied
        Foo newFoo = new Foo(oldFoo);
        return newFoo;

        // unfortunately, I can't predict what oldFoo's the actual class
        // is, so I can't go:
        // if (oldFoo instanceof Bar) { // copy Bar here }
    }
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*ine 6

如果您可以控制要复制的类,那么虚拟方法就是前进的方法:

class Foo {
    ...
    public Foo copy() {
        return new Foo(this);
    }
}
class Bar extends Foo {
    ...
    @Override public Bar copy() {
        return new Bar(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

(理想情况下,使类成为抽象或有效的最终.)

  • @ user237815我不这么认为.`Bar.copy`覆盖(用`@Override`检查)`Foo.copy`. (2认同)

gpe*_*che 5

Java 中最标准的方法是使每个可能被克隆的类都实现Cloneable,并Object.clone()用一个公共版本覆盖,该版本为该类进行适当的克隆(默认情况下Object.clone()制作对象的浅拷贝)。

请注意,许多人认为Cloneable/Object.clone()是糟糕的设计。