2009-08-12 35 views

Odpowiedz

21

Krótka odpowiedź: płytkie.

nie tak krótka odpowiedź: chyba że jest przesłonięta, AnyRef.clone() używa Java za Object.clone() jako jej realizacji.

Javadoc na Object.clone():

Klon Sposób klasa obiektu wykonuje określoną operację klonowania. Po pierwsze, jeśli klasa tego obiektu nie implementuje interfejsu Klonowalny, wówczas generowany jest wyjątek CloneNotSupportedException . Należy zauważyć, że wszystkie macierze są uznawane za implementujące interfejs Klonowalny. W przeciwnym razie ta metoda tworzy nową instancję klasy klasy tego obiektu i inicjalizuje wszystkie jej pola z dokładnie odpowiadającą polom odpowiednich obiektów tego obiektu, , jak przy przydziale; zawartość same pola nie są sklonowane. Tak więc ta metoda wykonuje "płytką kopię " tego obiektu, a nie operację "głęboka kopiowanie".

Uwaga:

  1. AnyRef.clone(), podobnie jak jego odpowiednik w języku Java, ma "chronione" poziom dostępu, więc jego nie wywoływalnym zewsząd.
  2. Będziesz musiał zaimplementować funkcję Cloneable, aby klon() działał.

Długa odpowiedź: Przeczytaj Effective Java, 2nd Edition, pkt 11: Zastąp klon rozważnie

Podsumowanie: nie używaj go. Istnieją lepsze alternatywy.

+3

"Istnieją lepsze alternatywy." Czy mógłbyś odwoływać się do niektórych? –

+6

1. Skopiuj konstruktora, na C++. 2. Case class z wbudowaną metodą "copy" w Scala 2.8.x. 3. Używaj niezmiennych obiektów: nie musisz kopiować, po prostu udostępniaj. –

+0

Czyli konstruktory kopii w stylu C++ są rzeczywiście (w rodzaju) w porządku w Scali? Przyszedłem do tego języka z C++ i zanim zrobiłem swoją pierwszą kopię, konstruktorzy chcieli sprawdzić, czy brakuje mi jakiegoś punktu. Wydaje się ... w porządku (moje obiekty mają zmienny stan). – akauppi

Powiązane problemy