2009-08-12 5 views

Antwort

14

Da Sie den Scalakörper auf einfachste Art und Weise und nicht am schnellsten scannen möchten, können Sie das Objekt immer serialisieren, sofern es serialisierbar ist, und es dann wieder deserialisieren. Der folgende Code wird nur ausgeführt, wenn er kompiliert wurde, nicht in 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

Schöne Antwort! Einfacher geht es nicht! –

+0

Ich habe ein wenig [Test] (https://gist.github.com/4409b8562ac24fc042b0), aber ich bekomme immer _ClassNotFoundException_ (und Fallklassen sind serialisierbar). – Tralamazza

6

Eine Java-spezifische Lösung (die auch in Scala gut funktionieren sollte), ist die Cloner library. Es ist schnell, einfach, klont Objekte tiefgründig auf Basis von Feldern (unter Verwendung von Reflektion) und ist klug genug, bekannte unveränderliche Objekte (wie String, Integer usw.) nicht zu klonen. Schließlich können Sie benutzerdefinierte unveränderbare Objekte registrieren, damit sie auch nicht geklont werden.

Ich empfehle es sehr.

+0

Das erste Mal habe ich von der Cloner-Bibliothek gehört. Klingt sehr praktisch! –