2010-02-21 161 views
4

我从来没有见过clone()方法在任何实际代码中使用。我正在读它,并觉得它的使用可能会使代码非常繁琐。 是否有clone()方法的任何特定用例?在什么情况下必须使用clone()以及为什么使用普通的析构函数还不够?用例克隆()

回答

2

Josh Bloch在Effective Java中也不建议使用clone()方法。

有几个问题用这种方法:

1)如果可复制的对象不仅有原始类型的字段,而且对象字段,然后克隆的对象将收到对这些对象的引用刚才而不是真正的克隆对象。为了避免这种情况,所有内部对象都应该可以复制。 2)如果你创建了一个可复制类的子类,那么它也是可复制的(即使你不想要)。这就是为什么你应该以适当的方式重写clone()方法以避免可能的问题。

当你应该使用它:从不,如果可能的话。你应该非常小心地使用它。如果您想要使可复制的对象中的所有字段都是原始类型,那么这并不危险。在所有其他情况下,在使用前请三思。

+0

嗯...这是我正在阅读的书..关于该方法的一切看起来很脏...想知道为什么它存在于所有 – Aadith 2010-02-21 15:34:57

+2

Java的第一个版本发布相当快。他们做了很棒的工作,他们的许多决定都非常聪明。但他们也犯了一些错误,比如java.util.Date类或clone()方法。如果它被添加到API一次,他们不能改变它。 – Roman 2010-02-21 15:39:17

+0

@Roman java.util.Date怎么样?为什么这是一个错误? – Aadith 2010-02-21 15:59:31

3

clone是使传递给方法或构造阵列的防御性拷贝很方便(如所有数组类型是Cloneable,并且被协变clone()签名以便boolean[].clone()实际上返回一个boolean[]而非Object)。这是我见过的十年中唯一真正好用的,尽管...