Przeczytałem wiele pytań na temat Javy, które są debiutantami, finalize()
i stwierdziłem, że jest to trochę oszałamiające, że nikt tak naprawdę nie wyjaśnił, że finalizacja () jest nierzetelnym sposobem na oczyszczenie zasobów. Widziałem, jak ktoś komentuje, że używają go do czyszczenia połączeń, co jest naprawdę przerażające, ponieważ jedynym sposobem na zbliżenie się do gwarancji zamknięcia połączenia jest wdrożenie try (catch) w końcu.
Nie uczyłem się w CS, ale programuję w Javie od blisko dekady i nigdy nie widziałem, żeby ktokolwiek wdrożył finalize()
system produkcyjny. To wciąż nie oznacza, że nie ma zastosowania, lub że ludzie, z którymi pracowałem, robili to dobrze.
Więc moje pytanie brzmi: jakie są przypadki użycia dla implementacji finalize()
, których nie można obsłużyć bardziej niezawodnie za pomocą innego procesu lub składni w języku?
Podaj konkretne scenariusze lub swoje wrażenia, po prostu powtórzenie podręcznika Java lub sfinalizowanie zamierzonego użycia nie jest wystarczające, ponieważ nie jest to celem tego pytania.
finalize()
. Jednak kod biblioteki platformy , taki jak SocketInputStream
, który zarządza rodzimymi zasobami w imieniu osoby dzwoniącej, robi to, aby zminimalizować ryzyko wycieku zasobów (lub używa równoważnych mechanizmów, takich jak te PhantomReference
, które zostały dodane później). Ekosystem potrzebuje ich , mimo że 99,9999% programistów nigdy go nie napisze.