我从未见过在任何真实代码中使用的clone()方法。我正在阅读它,并认为它的使用可能会使代码非常麻烦。 clone()方法有什么特定的用例吗?在什么情况下,必须使用clone(),为什么使用普通的结构不够?
答案 0 :(得分:3)
clone
非常方便地将数组的防御副本传递给方法或构造函数(因为所有数组类型都是Cloneable
,clone()
的签名是协变的,因此{{1}实际上返回boolean[].clone()
而不是boolean[]
)。这是十年来我见过的唯一非常好的用途,不过......
答案 1 :(得分:2)
Effective Java中的Josh Bloch也不建议使用clone()方法。
此方法存在以下几个问题:
1)如果可克隆对象不仅具有基本类型字段而且还具有对象字段,那么克隆对象将仅接收对这些对象的引用,但不接收真正的克隆对象。为避免这种情况,所有内部对象也应该是可克隆的。
2)如果你创建了一个可克隆类的子类,那么它也是可克隆的(即使你不想要)。这就是为什么你应该以适当的方式覆盖clone()方法以避免可能的问题。
当你应该使用它时:永远不可能。你应该非常小心地使用它。如果您想要克隆的对象中的所有字段都是原始类型,那么它并不危险。在所有其他情况下,在使用它之前要三思而行。