2009-08-12 14 views

Respuesta

14

Dado que desea la manera más fácil de copiar profundamente un objeto Scala y no el más rápido, siempre puede serializar el objeto, siempre que sea serializable, y luego deserializarlo. El siguiente código solo se ejecuta cuando se compila, no en 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

¡Buena respuesta! No puede ser mucho más fácil que esto! –

+0

Hice un poco [test] (https://gist.github.com/4409b8562ac24fc042b0) pero sigo recibiendo _ClassNotFoundException_ (y las clases de casos son serializables). – Tralamazza

6

Una solución específica de Java (que también debería funcionar bien en Scala) es la Cloner library. Es rápido, fácil, clona objetos profundamente en función de los campos (utilizando la reflexión) y es lo suficientemente inteligente como para no clonar objetos inmutables conocidos (como String, Integer, etc.). Finalmente, puede registrar objetos inmutables personalizados para que no los clonen tampoco.

Lo recomiendo encarecidamente.

+0

Primera vez que he oído hablar de la biblioteca Cloner. ¡Suena muy útil! –

Cuestiones relacionadas