假设我有集合,存储在
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
的任何方法的破坏者。