Финализаторы сами по себе имеют массу и множество недостатков, от того, что на создание Объекта уходит больше времени, чтобы не тратить ресурсы, пока поток финализатора не вызовет метод финализации и так далее.
Единственная причина, по которой его следует использовать, - это принять меры предосторожности при утилизации ресурсов, скажем, у InputStream есть метод, который приводит к close (), теперь это никогда не может быть вызвано. Другой случай, когда его нужно использовать, это при использовании нативного.
Нет абсолютно никакого другого случая, когда нужно это делать.
Теперь проблема с вашим желанием реализовать вышесказанное состоит в том, что говорят: существует объект с методом finalize (). Теперь, когда нет строгой ссылки на объект, он отправляется на сборку мусора. Теперь он проверяет из своей таблицы ввода, есть ли у этого конкретного объекта метод finalize () (который был отмечен при создании объекта в первую очередь). Теперь, когда поток финализатора запускает метод finalize (), и внутри этого метода есть блок кода, который в итоге привел к тому, что у этого метода есть сильная ссылка.
В следующий раз, когда тот же объект вызывается для сборки мусора, этот объект не отправляется в очередь финализатора второй раз (по умолчанию, поскольку ни один объект не может попасть в очередь финализатора более одного раза), следовательно, метод finalize () не вызывается второй раз. Это может привести к огромной проблеме.
Следовательно, если вы имеете дело с чем-то, убедитесь, что вы делаете это вне метода finalize (), а не в finalize (), поскольку это только приводит к проблемам и ничему другому