Scala AnyRef.clone执行浅或深拷贝吗?

Der*_*har 13 clone scala

在Scala中,是AnyRef.clone执行浅或深拷贝?

Wal*_*ang 21

简答:浅.

不那么简短的回答:除非被覆盖,否则AnyRef.clone()使用Java的Object.clone()作为其实现.

Object.clone()上的Javadoc:

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

请注意:

  1. AnyRef.clone()与Java中的对应物一样,具有"受保护"的访问级别,因此无法从任何地方调用它.
  2. 您需要实现Cloneable才能使clone()正常工作.

答案很长:阅读Effective Java,第2版,第11项:明智地覆盖克隆

摘要:不要使用它.有更好的选择.

  • 1.根据C++复制构造函数.2. Scala 2.8.x中内置"复制"方法的案例类.3.使用不可变对象:无需复制,只需共享. (6认同)
  • "有更好的选择." 你介意参考吗? (3认同)