2011-11-10 11 views
13

Czy istnieje sposób na wykonanie kopii obiektu (lub jeszcze lepiej listy obiektów)? Mówię o niestandardowych obiektach klas, które mogą być rozszerzone przez inne klasy.obiekty kopii scala

przykład:

class Foo() { 
    var test = "test" 
} 

class Bar() extends Foo { 
    var dummy = new CustomClass() 
} 

var b = new Bar() 
var bCopy = b.copy() // or something? 
+6

Pamiętaj, że nie musisz wykonywać kopii, jeśli zachowujesz niezmienność obiektów. –

Odpowiedz

21

W Javie, starali się rozwiązać tego problemu clone metoda, która działa poprzez wywoływanie clone we wszystkich super-klas, ale ten jest powszechnie uważany za złamane i najlepiej unikać, ze względu na ty może wyszukać (na przykład here).

Tak więc w Scali, tak jak w Javie, musisz stworzyć własną metodę kopiowania dla dowolnej klasy, która pozwoli ci określić takie rzeczy, jak głębokie lub płytkie kopiowanie pól.

Jeśli utworzysz klasę case class, otrzymasz bezpłatnie metodę copy. To rzeczywiście lepiej, ponieważ można aktualizować dowolne pole w tym samym czasie:

case class A(n: Int) 
val a = A(1)   // a: A = A(1) 
val b = a.copy(a.n) // b: A = A(1) 
val c = a.copy(2) // c: A = A(2) 

Jednak dziedziczenie z klas sprawa jest przestarzała.

+0

nie ma czegoś takiego jak: Collections.copy (list1, list2) w Javie, ale w przypadku scala? – user485659

+1

@ user485659 Jeśli pytasz konkretnie o kolekcje, możesz sprawdzić dokumentację i zobaczyć, że istnieje wiele metod tego typu. 'ArrayBuffer' ma na przykład metodę' clone'. Ale zwykle użyjesz niezmiennej "Listy", a jak zauważy Daniel Sobral, nie ma powodu, aby ją kopiować. –

+0

@LuigiPlinge Jak działa kopiowanie klas przypadków? Co to jest tylko kopiować zmienne przez odniesienie, czy robić coś innego? –