Finalizacja obiektów w Java

Finalizacja obiektów w Java to proces, w którym instancja obiektu jest przygotowywana do usunięcia przez Garbage Collector (GC). Mechanizm finalizacji daje ostatnią szansę na wykonanie kodu (np. zwolnienie zasobów) przed usunięciem obiektu. W tej lekcji przedstawimy, jak używać metody finalize() do zarządzania zasobami i czyszczenia przed usunięciem obiektu przez GC.

Przykład użycia finalizacji w Java

Załóżmy, że mamy klasę NetworkConnection, która zarządza połączeniem sieciowym. Chcielibyśmy upewnić się, że połączenie zostanie prawidłowo zamknięte, gdy obiekt jest niszczone przez Garbage Collector.

public class NetworkConnection {
    private boolean isConnected;

    public NetworkConnection() {
        this.isConnected = true;
        // Symulacja nawiązania połączenia
        System.out.println("Połączenie sieciowe zostało nawiązane.");
    }

    // Metoda zamykająca połączenie
    public void closeConnection() {
        if (isConnected) {
            isConnected = false;
            System.out.println("Połączenie sieciowe zostało zamknięte.");
        }
    }

    @Override
    protected void finalize() throws Throwable {
        // Sprawdzenie, czy połączenie nie zostało zamknięte
        if (isConnected) {
            closeConnection();
            System.out.println("Zasoby zostały " 
               + "zwolnione w metodzie finalize.");
        }
        super.finalize();
    }
}

Użycie klasy NetworkConnection

W poniższym przykładzie tworzymy instancję klasy NetworkConnection, a następnie pozwalamy na jej finalizację:

public class Main {
    public static void main(String[] args) {
        // Tworzenie nowego obiektu NetworkConnection
        NetworkConnection connection = new NetworkConnection();

        // Symulacja operacji na połączeniu
        // ...

        // Zakończenie pracy z obiektem i pozwolenie 
        // na jego finalizację
        connection = null;
        System.gc(); // Sugestia uruchomienia Garbage Collector

        // Oczekiwanie na finalizację
        try {
            Thread.sleep(1000); 
            // Czekanie na działanie GC 
            // (niezalecane w produkcji)
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Podsumowanie

Finalizacja w Java pozwala na czyszczenie zasobów i wykonanie niezbędnych operacji przed usunięciem obiektu przez Garbage Collector. Jest to przydatny mechanizm, szczególnie w kontekście zarządzania zasobami zewnętrznymi, takimi jak połączenia sieciowe. Należy jednak pamiętać, że nadużywanie finalizacji może prowadzić do opóźnień w działaniu Garbage Collector oraz potencjalnych wycieków zasobów. Zaleca się stosowanie try-with-resources lub innych mechanizmów zarządzania zasobami, gdzie to możliwe, zamiast polegania wyłącznie na metodzie finalize().

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