在Java中,要使一个类可克隆,我们需要实现Cloneable
接口。实现此接口只是表明该类支持克隆。
但是,Java语言设计者之所以没有将“允许克隆”作为每个类的默认功能,是出于什么动机呢?
我们已经有浅复制的默认实现了。那么为什么还要有这种限制呢?
想象一下克隆一个具有嵌套属性的对象。你希望递归多深?这可能会对内存造成压力,所以开发人员将其留给我们来决定。
有许多原因阻碍了克隆的实现,其中最主要的原因是克隆不像序列化一样可以解决通用问题。
默认情况下得到的浅拷贝在许多情况下会破坏对象的不变性,因此它不能作为一种通用的默认克隆机制。
"Cloneable" 接口是设计模式中的一种 "标记类"。基本上,在克隆方法中将会有一些引用到类型 "Cloneable"。当您实现 Cloneable 接口时,意味着您的类可以被引用为类型 "Cloneable"。
另一个实际的原因是,您可以重写 "clone()" 方法,并以自己特定的方式进行克隆。这意味着您认为重要的数据存在于新类中。