如何克隆未知类型的集合



假设我有集合,存储在

Collection<V> member;

或在

C member;

如何克隆这个类,同时克隆这个成员?

如何克隆这个类,同时克隆这个成员?

我假设您正在覆盖clone方法。因此,您可以使用提供的运行时类型member来获取新实例:

public class MyObject<V, C extends Collection<V>> {
    private C member = ...;
    @Override
    public MyObject clone(){
        MyObject clone = new MyObject();
        if(member != null){
             try {
                  clone.member = member.getClass().newInstance();
                  clone.member.addAll(member);
             } catch(InstantiationException | IllegalAccessException ignore){}
        }
        // clone other properties
        return clone;
    }
}

但这很脏,因为您永远无法确保C具有默认构造函数,或者如@shmosel所述,集合甚至可以是可模拟的。 例如,addAll()调用失败。

为了克服上述肮脏的方式,您可能需要在创建MyObject实例时Supplier<C>,这样您就可以根据需要创建自己的集合:

private final Supplier<C> factory;
public MyObject(Supplier<C> factory){
    this.factory;
}

并且仅在首次使用时创建member。通过调用factory.get() .

这样,您就可以在克隆对象时安全地创建member变量。但是,不变性仍然存在,这可能是将值从member复制到clone.member的任何方法的破坏者。

最新更新