假设我有收藏,存储在
中Collection<V> member;
或
C member;
如何克隆此类并同时克隆此成员?
答案 0 :(得分:0)
如何克隆此类并同时克隆此成员?
我假设你重写了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
的任何方法的破坏者。