2009-08-12 28 views

答えて

14

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

ニースの答え!これよりずっと簡単にはできません! –

+0

私は少し[テスト](https://gist.github.com/4409b8562ac24fc042b0)でしたが、_ClassNotFoundException_(ケースクラスはシリアライズ可能です)を取得し続けています。 – Tralamazza

6

Java固有のソリューション(Scalaでもうまくいくはずです)は、Cloner libraryです。これは、高速で簡単で、深くオブジェクトをフィールドに基づいて(リフレクションを使用して)クローンし、既知の不変オブジェクト(String、Integerなど)をクローン化しないほどスマートです。最後に、カスタム不変オブジェクトを登録して、それを複製しないようにすることもできます。

非常にお勧めします。

+0

初めてClonerライブラリについて聞いたことがあります。非常に便利ですね! –

関連する問題