Jaki jest najłatwiejszy sposób głębokiego klonowania (kopiowania) zmiennego obiektu Scala?Jaki jest najłatwiejszy sposób głębokiego klonowania (kopiowania) zmiennego obiektu Scala?
Odpowiedz
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)
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.
Po raz pierwszy usłyszałem o bibliotece Cloner. Brzmi bardzo przydatny! –
Dobra odpowiedź! Nie może być łatwiejsze niż to! –
Zrobiłem mały [test] (https://gist.github.com/4409b8562ac24fc042b0), ale wciąż otrzymuję _ClassNotFoundException_ (i klasy przypadków są serializowane). – Tralamazza