Klonowanie. Dlaczego return super.clone()

0

Cześć,
Szukam odpowiedzi na pytanie dlaczego w przypadku płytkiego kopiowania, nadpisując metodę clone() zwracam super.clone()

By convention, the returned object should be obtained by calling super.clone. If a class and all of its superclasses (except Object) obey this convention, it will be the case that x.clone().getClass() == x.getClass().

Wracając do tematu. Korzystając ze słowa super możemy wywołać metodę z nadklasy (w tym konstruktor). Jednak nie pasuje mi użycie tego w kontekście zwracania kopii obiektu. Przecież właśnie jest to kopiowanie płytkie, więc interesuje nas tylko podklasa. W związku z tym chciałbym zapytać skąd wzięło się to, że wywołujemy super.clone(), bo jednak odpowiedź z dokumentacji mnie nie satysfakcjonuje

1
Tomek Polak napisał(a):

Przecież właśnie jest to kopiowanie płytkie, więc interesuje nas tylko podklasa.

Nie, niestety nie rozumiesz co to jest kopia płytka. Kopia płytka to kopia całego obiektu a nie tylko podklasy. Od kopi głębokiej różni się tym że w przypadku podobiektów dla kopi płytkiej kopiujesz referencje na pod obiekty (czyli normalne przypisanie) a w przypadku kopii głębokiej kopiujesz wartości podobiektów do nowych podobiektów (czyli robisz clone/deepClone na podobiektach)

Czyli podsumowując:

  • Dla kopi płytkiej b = a.clone() a i b zawierają wspólne podobiekty. Modyfikacja podobiektu w jednym obiekcie wpływa na drugi obiekt
  • Dla kopi głębokiej b = a.deepClone(). b zawiera kopie podobiektów z a. Modyfikacja podobiektów w jednym obiekcie NIE wpływa na podobiekty drugiego obiektu.
1

Każda klasa dziedziczy z nadklasy, więc wydaje mi się naturalne, że należy zadbać również o stan odziedziczony z nadklasy :)

3

@Tomek Polak, a dlaczego chcesz korzystać z metody clone()? Generalnie nie jest to raczej najlepsze rozwiązanie ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1