Вот некоторые избранные цитаты из Effective Java 2nd Edition: Пункт 7: Избегайте финализаторов :
Финализаторы непредсказуемы, часто опасны и, как правило, не нужны . Их использование может вызвать нестабильное поведение, плохую производительность и проблемы с переносимостью. У финализаторов мало действительных применений, [...] как правило, вам следует избегать финализаторов.
Вы действительно должны убедиться, что на самом деле вам действительно нужны финализаторы; большую часть времени вы не делаете.
Программисты C ++ не должны думать о финализаторах как о Java-аналоге деструкторов C ++. В C ++ деструкторы являются обычным способом восстановления ресурсов, связанных с объектом, необходимого аналога конструкторам. В Java сборщик мусора восстанавливает хранилище, связанное с объектом, когда он становится недоступным, не требуя особых усилий со стороны программиста. Деструкторы C ++ также используются для восстановления других ресурсов памяти. В Java для этой цели обычно используется блок try-finally
.
Семантика при вызове финализаторов также важна:
Язык программирования Java не определяет, как скоро будет вызываться finalizer
[... ни], какой поток вызовет финализатор для любого данного объекта. [...] Если во время финализации генерируется неперехваченное исключение, оно игнорируется, и финализация этого объекта завершается. (JLS 12.6.2) Вызовы финализатора не заказаны
Более того, единственный механизм запуска финализатора по требованию сломан. Следующие цитаты взяты из Effective Java 2nd Edition:
[...] Единственные методы, которые утверждают, что гарантируют завершение, это System.runFinalizersOnExit
и его злой близнец Runtime.runFinalizersOnExit
. Эти методы смертельно несовершенны и устарели.
Блох пошел дальше, чтобы прокомментировать штраф за исполнение (выделение его):
О, и есть еще одна вещь: есть серьезное снижение производительности за использование финализаторов . На моей машине время создания и уничтожения простого объекта составляет около 5,6 нс. Добавление финализатора увеличивает время до 2400 нс. Другими словами, создание и уничтожение объектов с помощью финализаторов примерно в 430 раз медленнее.
С такими маленькими подробностями методологии сравнительного анализа, я не думаю, что конкретные цифры значат много, но это подтверждает то, что было широко задокументировано: финализаторы очень дороги.
Книга объясняет редкие сценарии, при которых допустимо использование финализаторов. Пропуск этих цитат из этого ответа является преднамеренным.