【问题标题】:Does Scala AnyRef.clone perform a shallow or deep copy?Scala AnyRef.clone 执行浅拷贝还是深拷贝?
【发布时间】:2010-11-19 00:43:59
【问题描述】:

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

【问题讨论】:

    标签: scala clone


    【解决方案1】:

    简答:肤浅。

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

    Object.clone() 上的 Javadoc:

    类 Object 的方法克隆 执行特定的克隆操作。 首先,如果这个对象的类 没有实现接口 可克隆,然后是 抛出 CloneNotSupportedException。 请注意,所有数组都被认为是 实现接口Cloneable。 否则,此方法会创建一个新的 此对象的类的实例 并初始化其所有字段 确切的内容 该对象的相应字段, 好像是通过分配;的内容 这些字段本身并没有被克隆。 因此,该方法执行“浅 此对象的副本,而不是“深 复制”操作。

    请注意:

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

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

    总结:不要使用。还有更好的选择。

    【讨论】:

    • “还有更好的选择。”你介意引用一些吗?
    • 1.复制构造函数,每个 C++。 2. Scala 2.8.x 中内置“复制”方法的案例类。 3.使用不可变对象:无需复制,只需共享。
    • 所以类似 C++ 的复制构造函数在 Scala 中实际上(有点)没问题?我是从 C++ 来到这门语言的,在做我的第一个复制构造函数之前,我想看看我是否遗漏了一些要点。似乎......这很好(我的对象具有可变状态)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 2016-09-27
    • 2012-01-30
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多