w Javie garbage collector automatycznie usuwa nieużywane obiekty, aby zwolnić pamięć. Programiści nie muszą oznaczać obiektów do usunięcia, co jest podatne na błędy i podatne na wyciek pamięci. Więc to rozsądne, że Java nie ma dostępnych destruktorów.
w przypadku, gdy obiekty posiadają otwarte gniazda, otwarte pliki lub połączenia z bazą danych, garbage collector nie jest w stanie odzyskać tych zasobów. Możemy zwolnić zasoby w metodzie close i użyć składni try-finally do wywołania metody później przed Javą 7, takich jak Klasy I / O FileInputStream i FileOutputStream. Począwszy od Javy 7, możemy zaimplementować interfejs Autoklosowalny i użyć instrukcji try-with-resources do pisania krótszego i czystszego kodu. Możliwe jednak, że użytkownicy API zapomną wywołać metodę close, więc metoda finalize i klasa Cleaner staną się siatką bezpieczeństwa. Ale proszę pamiętać, że nie są równoważne destruktorowi.
nie ma pewności, że zarówno metoda finalize, jak i klasa Cleaner będą działać szybko. Nie mają nawet szansy uciec przed JVM. Chociaż moglibyśmy zadzwonić do systemu.runfinalizacja sugerowanie, że JVM uruchamia metody finalizacji wszelkich obiektów oczekujących na finalizację, jest nadal niedeterministyczne. Co więcej, metoda finalize może powodować problemy z wydajnością, impasy itp. Więcej informacji można znaleźć w jednym z naszych artykułów: A Guide to the finalize Method in Java. Od wersji Java 9, Klasa Cleaner jest dodawana w celu zastąpienia metody finalize ze względu na jej wady. Dzięki temu mamy lepszą kontrolę nad nicią, która wykonuje czynności czyszczenia. Ale Java spec wskazuje na zachowanie czyszczenia Podczas systemu.exit jest specyficzny dla implementacji, a Java nie daje żadnych gwarancji, czy działania czyszczące zostaną wywołane, czy nie.