一位同事最近问我如何深度克隆Map,我意识到我可能从未使用过克隆()方法 - 这让我很担心.
您找到克隆对象的最常见方案是什么?
我假设你指的Object.clone()
是Java.如果是,请注意Object.clone()
有一些重大问题,并且在大多数情况下不鼓励使用它.请参阅Joshua Bloch的"Effective Java"中的第11项,以获得完整的答案.我相信你可以安全地使用Object.clone()
原始类型的数组,但除此之外,你需要明智地正确使用和重写克隆.您可能最好定义一个复制构造函数或静态工厂方法,根据您的语义显式克隆对象.
最常见的情况是,当我必须将一个可变对象返回给调用者时,我担心调用者可能会捣乱,通常是以线程不友好的方式.列表和日期是我最常做的.如果调用者可能想要迭代List并且我有线程可能更新它,那么返回它的克隆或副本会更安全.
实际上,这会带来一些我需要开辟的另一个问题:复制构造函数还是克隆?当我做C++时,我们总是做一个复制构造函数并用它实现克隆,但是如果你使用复制构造函数实现你的克隆,FindBugs不喜欢它.