2009-08-12 13 views

risposta

14

Poiché si desidera il modo più semplice per copiare in profondità un oggetto Scala e non il più veloce, è sempre possibile serializzare l'oggetto, a condizione che sia serializzabile e quindi deserializzare di nuovo. Il seguente codice viene eseguito solo quando compilato, non 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

Bella risposta! Non può essere molto più facile di così! –

+0

Ho fatto un piccolo [test] (https://gist.github.com/4409b8562ac24fc042b0) ma continuo a ricevere _ClassNotFoundException_ (e le classi di casi sono serializzabili). – Tralamazza

6

Una soluzione specifica per Java (che dovrebbe funzionare anche in Scala) è la Cloner library. È veloce, facile, profondamente clona gli oggetti basati sui campi (usando la riflessione) ed è abbastanza intelligente da non clonare oggetti immutabili noti (come String, Integer, ecc.). Infine, puoi registrare oggetti immutabili personalizzati così da non clonarli.

Lo consiglio vivamente.

+0

Prima volta ho sentito parlare della libreria Cloner. Sembra molto utile! –

Problemi correlati