假设我有收藏,存储在
Collection<V> member;
或者在
C member;
如何克隆这个类同时克隆这个成员?
如何克隆这个类同时克隆这个成员?
我假设你压倒了clone
方法。因此,您可以使用提供的member
的runtimeType来获取新实例:
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()
呼叫失败。
要克服上述肮脏的方式,在创建Supplier<C>
实例时可能需要MyObject
,这样您就可以根据需要创建自己的集合:
private final Supplier<C> factory;
public MyObject(Supplier<C> factory){
this.factory;
}
并且只在第一次使用时创建member
。通过调用factory.get()
。
这样,您可以在克隆对象时安全地创建member
变量。但是,仍然存在可变性的情况,这可能是将值从member
复制到clone.member
的任何方法的破坏者。