是否存在克隆接口对象或任何其他问题的问题
问题?
从概念上讲,这是不对的。
您不会克隆接口。
您只克隆实例。
因此,这意味着在您的情况下,您还希望克隆接口实现。
我的问题是除了接口变量我还有五个变量
虽然克隆所有五个变量正在获取但不是这个接口
变量。
这些变量很可能是原语,默认的 clone() 行为是“正常的”,因为原语复制意味着原语赋值,例如 clone.myInt = original.myInt,这不会导致原始变量和克隆变量之间共享 myInt 变量对象。
但是这个:
private ValueChangeObserver observer = null;
不是原语。
因此,当您克隆 BaseModelItem 实例时,observer 字段将引用原始对象和克隆对象中完全相同的对象。
因此,您应该指定如何克隆该变量。
你应该写这样的东西:
private ValueChangeObserver observer = null;
...
@Override
public WiSeConBaseModelItem clone() {
WiSeConBaseModelItem clonedItem = (WiSeConBaseModelItem) super.clone();
cloneItem.observer = observer.clone();
return clonedItem;
}
因此,这意味着您必须在 ValueChangeObserver 的每个实现中覆盖 clone(),但您还必须在 ValueChangeObserver 中定义 clone(),因为它没有声明它:
public interface ValueChangeObserver {
onChanged(Object obj);
}
事实上,你甚至不应该使用clone() 和Cloneable()。
所有这一切都应该让您意识到覆盖 clone() 是复杂的、容易出错的(而且它对可变类包含的 final 字段也有一个重要限制,因为您无法重新分配 final 字段)。
所以,忘记clone(),而倾向于使用复制构造函数:
public WiSeConBaseModelItem copy() {
WiSeConBaseModelItem copy = new WiSeConBaseModelItem(primitiveOne, primitiveTwo, primitiveThree, observer.copy() ...);
return copy;
}
您也可以使用反射库来执行复制。
它避免了编写样板代码。
请注意,处理时间可能更重要一些。所以应该考虑。