【问题标题】:What is the easiest way to deeply clone (copy) a mutable Scala object?深度克隆(复制)可变 Scala 对象的最简单方法是什么?
【发布时间】:2010-11-19 00:58:51
【问题描述】:

深度克隆(复制)可变 Scala 对象的最简单方法是什么?

【问题讨论】:

    标签: scala clone


    【解决方案1】:

    由于您想要深度复制 Scala 对象的最简单方法而不是最快方法,因此您始终可以序列化该对象,前提是它是可序列化的,然后再将其反序列化。以下代码仅在编译时运行,在 REPL 中不运行。

    def deepCopy[A](a: A)(implicit m: reflect.Manifest[A]): A =
      util.Marshal.load[A](util.Marshal.dump(a))
    
    val o1 = new Something(...) // "Something" has to be serializable
    val o2 = deepCopy(o1)
    

    【讨论】:

    • 我做了一点 test 但我不断收到 ClassNotFoundException (并且案例类是可序列化的)。
    【解决方案2】:

    Cloner library 是一个特定于 Java 的解决方案(在 Scala 中也应该可以很好地工作)。它快速、简单、基于字段(使用反射)深度克隆对象,并且足够聪明,不会克隆已知的不可变对象(如字符串、整数等)。最后,您可以注册自定义的不可变对象,这样它也不会克隆它们。

    我强烈推荐它。

    【讨论】:

    • 我第一次听说克隆库。听起来很方便!
    • 感谢您提及克隆库。在我的 spark scala 代码中工作就像一个魅力。
    猜你喜欢
    • 2021-03-20
    相关资源
    最近更新 更多