Klonowanie. Dlaczego return super.clone()

Klonowanie. Dlaczego return super.clone()
Tomek Polak
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Postów:29
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

KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
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.

Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 2x, ostatnio: KamilAdam
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 7 godzin
  • Postów:1880
1

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


”Engineering is easy. People are hard.” Bill Coughran
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
3

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


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
Charles_Ray
+1, nie widziałem tego nigdy w kodzie produkcyjnym

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.