R1cjFdx4IrmHM
Fotografia przedstawia ulicę, na której stoi koparka i biało‑czerwone znaki ostrzegawcze.

I_R_W13A_M01_JAVA Konstruktory i destruktory w Java

Źródło: Matthew Hamilton, domena publiczna.

Konstruktory

Konstruktor to specjalna funkcja (metoda klasy), wywoływana, gdy tworzona jest instancja danej klasy. Wewnątrz konstruktora zdefiniowane są instrukcje, które mają zostać wykonane przy utworzeniu obiektu klasy.

W językach programowania (o ile dany język wspiera programowanie obiektowe) konstruktory deklarowane są na różne sposoby. Najczęściej jednak konstruktor przyjmuje nazwę klasy, w której się znajduje.

Konstruktor zwykły

Przeanalizujmy przykład konstruktora zwykłego.

Linia 1. klasa Uczen. Linia 2. imie dwukropek tekst. Linia 3. nazwisko dwukropek tekst. Linia 4. wiek dwukropek liczba całkowita. Linia 6. funkcja Uczen otwórz nawias okrągły imieUcznia przecinek nazwiskoUcznia przecinek wiekUcznia zamknij nawias okrągły. Linia 7. imie ← imieUcznia. Linia 8. nazwisko ← nazwiskoUcznia. Linia 9. wiek ← wiekUcznia.

Zdefiniowana w 6. linii funkcja o nazwie Uczen() to analizowany przez nas konstruktor. Oznacza to, że funkcja ta zostanie wywołana podczas tworzenia obiektu klasy Uczen. Należy wtedy podać trzy parametry, które nadadzą wartości atrybutom klasy Uczen: imie, nazwisko, wiek.

W obrębie danej klasy może być zdefiniowanych wiele konstruktorów. Jeżeli chcemy stworzyć więcej niż jeden konstruktor, to każdy z nich musi różnić się typem, liczbą lub kolejnością parametrów.

W zależności od języka programowania wyróżnia się specjalne typy konstruktorów. Omówimy tutaj niektóre z nich.

Konstruktor domyślny

To rodzaj konstruktora, który nie ma zdefiniowanych parametrów (bądź mają one ustawione wartości domyślne). Podczas tworzenia obiektu klasy za pomocą konstruktora domyślnego, nie są podawane żadne argumenty. W przypadku gdy dla danej klasy nie zdefiniowano żadnego konstruktora, zostanie on wygenerowany automatycznie, zgodnie ze specyfikacją danego języka programowania.

Oto przykłady tego rodzaju konstruktora:

Linia 1. klasa Uczen. Linia 2. imie dwukropek tekst. Linia 3. nazwisko dwukropek tekst. Linia 4. wiek dwukropek liczba całkowita. Linia 6. funkcja Uczen otwórz nawias okrągły zamknij nawias okrągły. Linia 7. imie ← cudzysłów Imię cudzysłów. Linia 8. nazwisko ← cudzysłów Nazwisko cudzysłów. Linia 9. wiek ← 22. Linia 11. funkcja Uczen otwórz nawias okrągły imieUcznia ← cudzysłów Imię cudzysłów przecinek nazwiskoUcznia ← cudzysłów Nazwisko cudzysłów przecinek wiekUcznia ← 22 zamknij nawias okrągły. Linia 12. imie ← imieUcznia. Linia 13. nazwisko ← nazwiskoUcznia. Linia 14. wiek ← wiekUcznia.

Drugi z konstruktorów przedstawionych w pseudokodzie pełni funkcję zarówno konstruktora domyślnego, jak i zwykłego.

Konstruktor kopiujący

Taki konstruktor przyjmuje tylko jeden argument - referencję do obiektu tej samej klasy. Następnie ma on za zadanie skopiowanie wartości pól z obiektu podanego przez referencję do nowo tworzonej instancji klasy.

Linia 1. klasa Uczen. Linia 2. imie dwukropek tekst. Linia 3. nazwisko dwukropek tekst. Linia 4. wiek dwukropek liczba całkowita. Linia 6. funkcja Uczen otwórz nawias okrągły uczen zamknij nawias okrągły. Linia 7. imie ← uczen kropka imie. Linia 8. nazwisko ← uczen kropka nazwisko. Linia 9. wiek ← uczen kropka wiek.

Przedstawiony przykład pokazuje praktyczne wykorzystanie konstruktora kopiującego. Utworzono obiekt klasy Uczen oraz – poprzez konstruktor zwykły – zostały podane wartości parametrów: "Jan", "Kowalski", 12. Następnie utworzono drugi obiekt (również klasy Uczenuczen2) za pomocą konstruktora kopiującego.

W obiekcie uczen2 wartości pól imie, nazwisko, wiek będą takie same, jak w obiekcie uczen, czyli odpowiednio: "Jan", "Kowalski", 12.

Linia 1. klasa Uczen. Linia 2. imie dwukropek tekst. Linia 3. nazwisko dwukropek tekst. Linia 4. wiek dwukropek liczba całkowita. Linia 6. funkcja Uczen otwórz nawias okrągły imieUcznia przecinek nazwiskoUcznia przecinek wiekUcznia zamknij nawias okrągły. Linia 7. imie ← imieUcznia. Linia 8. nazwisko ← nazwiskoUcznia. Linia 9. wiek ← wiekUcznia. Linia 11. funkcja Uczen otwórz nawias okrągły uczen zamknij nawias okrągły. Linia 12. imie ← uczen kropka imie. Linia 13. nazwisko ← uczen kropka nazwisko. Linia 14. wiek ← uczen kropka wiek. Linia 16. Uczen uczen ← nowy Uczen otwórz nawias okrągły cudzysłów Jan cudzysłów przecinek cudzysłów Kowalski cudzysłów przecinek 12 zamknij nawias okrągły. Linia 17. Uczen uczen2 ← nowy Uczen otwórz nawias okrągły uczen zamknij nawias okrągły.

Konstruktor teleskopowy

Szczególnym rodzajem konstruktora jest konstruktor teleskopowy. Zakłada on w rzeczywistości utworzenie kilku konstruktorów. Spójrzmy na przykład:

Linia 1. klasa Osoba. Linia 2. imie dwukropek tekst. Linia 3. drugieImie dwukropek tekst. Linia 4. nazwisko dwukropek tekst. Linia 5. nazwiskoRodowe dwukropek tekst. Linia 6. wiek dwukropek liczba całkowita. Linia 8. funkcja Osoba otwórz nawias okrągły imieOsoby przecinek drugieImieOsoby przecinek nazwiskoOsoby przecinek nazwiskoRodoweOsoby przecinek wiekOsoby zamknij nawias okrągły. Linia 9. imie ← imieOsoby. Linia 10. drugieImie ← drugieImieOsoby. Linia 11. nazwisko ← nazwiskoOsoby. Linia 12. nazwiskoRodowe ← nazwiskoRodoweOsoby. Linia 13. wiek ← wiekOsoby.

Przedstawiony konstruktor klasy Osoba umożliwia utworzenie i nadanie wartości atrybutom obiektu tej klasy. Gdybyśmy skorzystali z tego konstruktora, musielibyśmy podać wszystkie wartości atrybutów. Co jednak w przypadku, gdy dana osoba nie będzie miała drugiego imienia?

Konstruktor teleskopowy okazuje się bardzo przydatny, gdy w obrębie klasy są zdefiniowane atrybuty opcjonalne, takie jak np. drugie imię.

Zobaczmy, jak wygląda jego budowa:

Linia 1. klasa Osoba. Linia 2. imie dwukropek tekst. Linia 3. drugieImie dwukropek tekst. Linia 4. nazwisko dwukropek tekst. Linia 5. nazwiskoRodowe dwukropek tekst. Linia 6. wiek dwukropek liczba całkowita. Linia 8. funkcja Osoba otwórz nawias okrągły imieOsoby przecinek nazwiskoOsoby przecinek nazwiskoRodoweOsoby przecinek wiekOsoby zamknij nawias okrągły. Linia 9. imie ← imieOsoby. Linia 10. nazwisko ← nazwiskoOsoby. Linia 11. nazwiskoRodowe ← nazwiskoRodoweOsoby. Linia 12. wiek ← wiekOsoby. Linia 15. funkcja Osoba otwórz nawias okrągły imieOsoby przecinek drugieImieOsoby przecinek nazwiskoOsoby przecinek nazwiskoRodoweOsoby przecinek wiekOsoby zamknij nawias okrągły. Linia 16. Osoba otwórz nawias okrągły imieOsoby przecinek nazwiskoOsoby przecinek nazwiskoRodoweOsoby przecinek wiekOsoby zamknij nawias okrągły. Linia 17. drugieImie ← drugieImieOsoby.

W tym przykładzie pierwszy konstruktor nadaje wartości atrybutom, które nie są opcjonalne – zakładamy, że każda osoba musi mieć imię, nazwisko, nazwisko rodowe i wiek. Drugi konstruktor zawiera w sobie wywołanie pierwszego konstruktora (dla atrybutów imie, nazwisko, nazwiskoRodowe oraz wiek), a także oprócz tego nadaje wartość drugiego imienia.

Słownik

instancja klasy
instancja klasy

niezależny obiekt danej klasy, zajmujący określone miejsce w pamięci

argument
argument

konkretna wartość lub zmienna przekazywana do funkcji lub metody przy jej wywołaniu

parametr
parametr

definicja zmiennej zawarta w deklaracji metody lub funkcji; deklarujemy ją w nawiasach, np. funkcja(liczba parametr1, tekst parametr2)

referencja
referencja

zmienna zawierająca informacje o położeniu w pamięci innej zmiennej lub obiektu

garbage collector
garbage collector

jedna z metod automatycznego zarządzania dynamicznie przydzielaną pamięcią; za proces jej zwalniania odpowiedzialny jest programowy zarządca zwany w skrócie GC

klasa
klasa

zdefiniowany przez programistę złożony typ zmiennej, która może zawierać metody oraz pola danych

konstruktor
konstruktor

specjalna metoda danej klasy, którą wywołuje się podczas tworzenia jej instancji; zadaniem konstruktora jest zainicjowanie obiektu, a w niektórych językach programowania także utworzenie obiektu

destruktor
destruktor

przeciwieństwo konstruktora; specjalna metoda, wywoływana przez program przed usunięciem obiektu

obiekt
obiekt

pojedyncza instancja pewnej klasy, czyli zmienna o jej typie; struktura zawierająca dane oraz metody (funkcje służące do wykonywania na tych danych określonych zadań)