深度克隆(复制)可变Scala对象的最简单方法是什么?
答案 0 :(得分:15)
由于您希望以最简单的方式深度复制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)
答案 1 :(得分:7)
特定于Java的解决方案(在Scala中应该也很有效)是Cloner library。它快速,简单,深度克隆基于字段(使用反射)的对象,并且足够聪明,不会克隆已知的不可变对象(如String,Integer等)。最后,您可以注册自定义不可变对象,以便它们也不会克隆它们。
我强烈推荐它。