2009-08-12 12 views

Odpowiedz

14

Ponieważ chcesz najprostszy sposób na głęboką kopiowanie obiektu Scala, a nie najszybszego, zawsze możesz serializować obiekt pod warunkiem, że jest możliwy do serializacji, a następnie deserializować go z powrotem. Poniższy kod działa tylko po skompilowaniu, a nie w 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

Dobra odpowiedź! Nie może być łatwiejsze niż to! –

+0

Zrobiłem mały [test] (https://gist.github.com/4409b8562ac24fc042b0), ale wciąż otrzymuję _ClassNotFoundException_ (i klasy przypadków są serializowane). – Tralamazza

6

Rozwiązaniem specyficznym dla języka Java (które również powinno działać dobrze w Scala) jest Cloner library. Jest szybki, łatwy, głęboko klonuje obiekty oparte na polach (za pomocą odbicia) i jest wystarczająco inteligentny, aby nie klonować znanych niezmiennych obiektów (takich jak String, Integer itp.). Na koniec możesz zarejestrować niestandardowe niezmienne obiekty, aby nie je sklonować.

Gorąco polecam.

+0

Po raz pierwszy usłyszałem o bibliotece Cloner. Brzmi bardzo przydatny! –

Powiązane problemy