Dlaczego używamy metody finalize() w Javie?

Metoda finalize() w języku Java odgrywa specyficzną rolę w zarządzaniu pamięcią i jest wywoływana przez Garbage Collector przed usunięciem obiektu z pamięci. Jej głównym celem jest umożliwienie programiście wykonania pewnych operacji czyszczących, zanim obiekt zostanie ostatecznie zniszczony. Metoda ta może być przydatna, na przykład, w sytuacjach, gdy musimy upewnić się, że wszystkie zasoby zewnętrzne, takie jak połączenia z bazami danych czy pliki, zostały zamknięte.

Jednakże, ważne jest zrozumienie, że jej używanie jest obecnie uważane za przestarzałe (deprecated) z kilku powodów. Po pierwsze, nie ma gwarancji, kiedy (lub nawet czy w ogóle) metoda finalize() zostanie wywołana. Po drugie, może to prowadzić do problemów z wydajnością i stabilnością aplikacji.

Przykład użycia metody finalize()

Poniżej znajduje się przykład, w którym tworzymy prostą klasę Resource, która reprezentuje pewien zasób, który musi być zamknięty przed usunięciem obiektu.

public class Resource {
    // Symulacja otwartego zasobu
    private boolean isOpen = true;

    // Metoda do zamknięcia zasobu
    public void close() {
        isOpen = false;
        System.out.println("Zasób został zamknięty.");
    }

    // Finalize jest wywoływane przed usunięciem obiektu
    @Override
    protected void finalize() throws Throwable {
        if (isOpen) {
            close();
        }
        super.finalize();
    }
}

public class Main {
    public static void main(String[] args) {
        Resource res = new Resource();
        // Tutaj normalnie używamy zasobu
        // Na końcu programu zasób zostanie zamknięty przez finalize(),
        // jeżeli nie został zamknięty wcześniej
    }
}

Komentarze do kodu:

  • W klasie Resource, definiujemy zmienną isOpen, która informuje nas, czy zasób jest otwarty.
  • Metoda close() służy do “zamykania” zasobu, czyli ustawienia isOpen na false i symulacji tego procesu.
  • Nadpisana metoda finalize() sprawdza, czy zasób nie został zamknięty i jeśli nie, to go zamyka. Jest to swego rodzaju “sieć bezpieczeństwa”, na wypadek, jeśli zasoby nie zostałyby zamknięte w normalnym przepływie programu.

Podsumowanie

Mimo że metoda finalize() może wydawać się przydatna do zarządzania zasobami, powinna być używana z dużą ostrożnością, a lepszym podejściem jest korzystanie z bloków try-with-resources lub explicite wywoływanie metod czyszczących w odpowiednim momencie życia obiektu. Zaleca się unikanie finalize() w nowych projektach ze względu na jej nieprzewidywalność i potencjalne problemy z wydajnością.

Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs video Java w którym nauczysz się tego języka od podstaw do zaawansowanych jego  aspektów.

Scroll to Top