Jak stworzyć niezależną kopię obiektu

0

Witam,
mam pytanie:
stworzyłem wektor/listę obiektów klasy "Czlowiek". Klasa "Czlowiek" przechowuje informacje o współrzędnych i wyglądzie tego człowieka. Załóżmy że stworzyłem nowego człowieka:
Czlowiek stasiu = new Czlowiek(costam);
Teraz w wektorze/liście chcę umieścić jego idealne kopie (czyli kopie tej klasy):

 
for (int y = 0; y < 4; y++) {
tablica.add(stasiu);
}

Co ja w tej chwili zrobiłem? Czy stworzyłem kilka nowych klas i przypisałem je do tablicy, czy cała tablica jest zapełniona odwołaniami do tej jednej?
Chyba to drugie, bo moja gra wyswietla tylko jeden obiekt, a powinny pokazać się i oryginalny stasiu i jego kopie z wektora...
Co zrobić żeby w tablicy utworzyć niezależne kopie, a nie odwołania do klasy?

1

Zapisałeś w tablicy referencje do tej samej instancji. Tutaj masz info jak się powinno robić kopiowanie obiektów w Javie: http://en.wikipedia.org/wiki/Object_copy#In_Java

2

Masz rację, że wszystkie obiekty w tablicy to ten sam obiekt.
Rozwiązań jest kilka:

  1. tworzyć kolejne obiekty w pętli. Prostackie i wbrew pozorom nie takie proste jeżeli mają się czymś różnić (kwestia przekazania parametrów)
  2. jest sobie taka metoda jak clone, która jest jednak spartolona od początku i należy zaimplementować interfejs Clonable by to wszystko w miarę dobrze działało.
  3. trochę inna wersja poprzedniej metody czyli konstruktor kopiujący - przyjmuje jako parametr obiekt tego samego typu i przepisuje jego pola. Tu ważne pojęcie "płytkie klonowanie" oznaczające, że mamy dwa obiekty, ale ich pola wskazują na te same obiekty.
  4. wzorce typu prototyp, fabryka, budowniczy, itp. gdzie wywołując odpowiednie metody otrzymujesz nowe obiekty bez wnikania jak to działa "pod spodem". Przydatne gdy chcesz zrobić coś bardziej skomplikowanego np. skorzystać ze wzorca singleton czy też puli.
0

Jest jeszcze jedno rozwiązanie: zastanowić się, czy Twoja klasa nie mogłaby być "immutable" - czyli taka, której obiekty nie zmieniają swojej zawartości (opis tu: http://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html ). W Javie tego typu obiekty są zwykle opisywane w kontekście wielowątkowości, ale nawet bez wielowątkowości obiekty immutable są IMHO fajne. Jeśli program operuje na takich obiektach, to kopiowanie jest po prostu niepotrzebne.

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