Для чего нужен метод finalize

Задача
Освободить ресурсы перед удалением объекта из памяти

Решение
Язык Java использует автоматический сборщик мусора для освобожения памяти от неиспользуемых объектов. Если рассматривать данный механизм упрощенно, то объект может быть удален сборщиком мусора, если на объект не указывают ссылки в памяти.

В Java предусмотрен механизм финализации, т.е. выполнение определенных действий перед удалением объекта сборщиком мусора. Данные действия могут потребоваться для освобождения каких-либо ресурсов, например, файлов или сетевых соединений. Финализация достигается за счет реализации метода finalize:
protected void finalize(){
 
}

Данный метод является защищенным (protected) в базовом классе java.lang.Object. В нашем классе мы переопределяем данный метод и выполняем необходимые действия. В примере ниже происходит освобождение некоторого ресурса.
public class ExampleClass{

  private MyResource myRes;

  protected void finalize(){
      if (null != myRes){
          myRes.close();
      }
  }
}

Отметим, что не известно когда будет запущен сборщик мусора и будет ли он запущен вообще в ходе выполнения программы, поэтому соответственно нет никаких гарантий запуска метода finalize

В отличие от конструкторов не происходит неявного вызова метода предка (суперкласса) , поэтому при необходимости следует вызывать finalize метод предка явным образом
protected void finalize(){
    if (null != myRes){
        myRes.close();
    }  

    super.finilize();
}
comments powered by Disqus