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.