Метод finalize ()

Иногда при уничтожении объект должен будет выполнять какое-либо действие. Например, если объект содержит какой-то ресурс, отличный от ресурса Java (вроде файлового дескриптора или шрифта), может требоваться гарантия освобождения этих ресурсов перед уничтожением объекта. Для подобных ситуаций Java предоставляет механизм, называемый финализацией. Используя финализацию, можно определить конкретные действия, которые будут выполняться непосредственно перед удалением объекта сборщиком мусора.

Чтобы добавить в класс средство выполнения финализации, достаточно определить метод finalize (). Среда времени выполнения Java вызывает этот метод непосредственно перед удалением объекта данного класса. Внутри метода finalize () нужно указать те действия, которые должны быть выполнены перед уничтожением объекта. Сборщик мусора запускается периодически, проверяя наличие объектов, на которые отсутствуют ссылки как со стороны какого-либо текущего состояния, так и косвенные ссылки через другие ссылочные объекты. Непосредственно перед освобождением ресурсов среда времени выполнения Java вызывает метод finalize () по отношению к объекту.

Общая форма метода finalize () имеет следующий вид:

protected void finalize ( ) {
// здесь должен находиться код финализации
}

В этой синтаксической конструкции ключевое слово protected — спецификатор, который предотвращает доступ к методу finalize () со стороны кода, определенного вне его класса.

Важно понимать, что метод finalize () вызывается только непосредственно перед сборкой мусора. Например, он не вызывается при выходе объекта за рамки области определения. Это означает, что неизвестно, когда будет — и, даже будет ли вообще — выполняться метод finalize (). Поэтому программа должна предоставлять другие средства освобождения используемых объектом системных ресурсов и тому подобного. Нормальная работа программы не должна зависеть от метода finalize ().

На заметку. Те читатели, которые знакомы с языком С++, знают, что он позволяет определять деструктор класса, который вызывается при выходе объекта за пределы области определения. Java не поддерживает эту концепцию и не допускает использование деструкторов. По своему функционированию метод finalaize () лишь отдаленно напоминает деструктор. По мере приобретения опыта программирования на Java вы убедитесь, что благодаря наличию подсистемы сборки мусора потребность в функциях деструктора очень незначительна.