小编典典

在Java中实现克隆是否有其他选择?

java

在我的Java项目中,我有各种类型的Traders的载体。这些不同类型的交易者是交易者类的子类。现在,我有一个以交易者为参数并将其存储在向量中约50次的方法。我遇到了问题,因为存储同一对象50次仅存储同一对象的50个
引用 。我需要存储该对象的50个 副本
。我已经研究了实现Clone的方法,但是我不希望定义Trader类型的程序员不必担心使其类可克隆。另外,正如本页面所指出的,实施克隆会产生各种问题。我认为复制构造函数也不起作用,因为如果我在Trader类中定义了一个复制构造函数,它将不会知道它正在复制的Trader类型,而只是创建一个通用Trader。我能做什么?

编辑:我不是真的想要特定对象的精确副本。我真正想做的是向向量添加一定数量的交易者。问题是用户需要在参数中指定他要添加哪种类型的交易者。这是我要执行的操作的一个示例:(尽管我的语法完全是虚构的)

public void addTraders(*traderType*)
{
    tradervect.add(new *traderType*())
}

如何在Java中实现类似的功能?


阅读 189

收藏
2020-11-19

共1个答案

小编典典

只需添加一个抽象的复制方法。您可以使用协变返回类型,以便指定派生类型以返回派生实例,这可能重要也可能不重要。

public interface Trader {
    Trader copyTrader();
    ...
}


public final class MyTrader implements Trader {
    MyTrader copyTrader() {
        return new MyTrader(this);
    }
    ...
}

有时,您可能需要一般性地处理Trader需要克隆的派生类型的集合,然后返回正确类型的集合。为此,您可以惯用方式使用泛型:

public interface Trader<THIS extends Trader> {
    THIS copyTrader();
    ...
}


public final class MyTrader implements Trader<MyTrader> {
    public MyTrader copyTrader() {
        return new MyTrader(this);
    }
    ...
}
2020-11-19