Scala的AnyRef.clone方法执行浅拷贝还是深拷贝?

14
在Scala中,AnyRef.clone方法执行的是浅复制还是深复制?
1个回答

21

简短回答: 浅拷贝。

稍长回答: 除非被覆盖,AnyRef.clone() 使用 Java 的 Object.clone() 作为其实现。

关于 Object.clone() 的 Javadoc:

Object 的 clone 方法执行特定的克隆操作。首先,如果此对象的类没有实现 Cloneable 接口,则会抛出 CloneNotSupportedException 异常。请注意,所有数组都被视为实现了 Cloneable 接口。否则,此方法创建此对象类的一个新实例,并使用与该对象对应字段的内容完全相同的内容初始化其所有字段,就像通过赋值一样;字段的内容本身不会被克隆。因此,此方法执行此对象的 "浅层拷贝",而不是 "深层拷贝" 操作。

请注意:

  1. AnyRef.clone() 的访问级别为“protected”,与 Java 中的对应项一样,因此并不是从任何地方都可以调用。
  2. 您需要实现 Cloneable 接口才能使用 clone() 方法。

详细回答: 请阅读 Effective Java, 2nd Edition, Item 11: Override clone judiciously

总结: 不要使用它。有更好的替代方法。


3
有更好的替代选择。你介意给出一些参考吗? - Alex Neth
6
  1. C++ 中的复制构造函数。
  2. Scala 2.8.x 中具有内置 "copy" 方法的 case 类。
  3. 使用不可变对象:无需复制,只需共享。
- Walter Chang
那么在Scala中,类似于C++的复制构造函数实际上是可以(有点)使用的吗?我是从C++转到这种语言的,在编写我的第一个复制构造函数之前想知道是否有什么需要注意的地方。看起来...没问题(我的对象具有可变状态)。 - akauppi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接