Хорошее использование метода finalize()

Это в основном из любопытства.

Я блуждал, если кто-нибудь столкнулся с каким-либо хорошим использованием для Object.finalize(), за исключением целей отладки/регистрации/профилирования?

Если вы не столкнулись ни с чем, что бы вы сказали, хорошее использование было бы?

Ответы

Ответ 1

Если ваш Java-объект использует JNI для указания собственного кода для выделения собственной памяти, вам нужно использовать finalize, чтобы убедиться, что он освобожден.

Ответ 2

Поздно к вечеринке здесь, но я думал, что все еще буду звонить:

Одним из лучших применений, которые я нашел для финализаторов, является вызов явных методов завершения, которые по какой-либо причине не были вызваны. Когда это происходит, мы также регистрируем проблему, потому что это BUG!

Потому что:

  • Нет гарантии, что финализаторы будут выполняться оперативно (или технически вообще), по языковой спецификации
  • Выполнение в значительной степени зависит от реализации JVM.
  • Выполнение может иногда задерживаться, если GC имеет более низкий приоритет потока

Это оставляет только несколько задач, с которыми они могут обращаться без особого риска.

Ответ 3

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

Но это просто резерв, который используется, "нормальный" механизм не работает. Нормальный механизм должен быть инициирован явно.

Ответ 4

Я использую его для записи данных в базу данных при использовании мягких ссылок для кэширования объектов с поддержкой базы данных.

Ответ 5

Выпустите ресурсы, которые должны быть выпущены вручную в обычных обстоятельствах, но по какой-то причине не были выпущены. Возможно, с записью предупреждения в журнал.

Ответ 6

Я вижу одно хорошее использование для finalize(): освобождение ресурсов, которые доступны в больших количествах и не являются исключительными.

Например, по умолчанию для процесса Linux доступно 1024 файла и около 10000 для Windows. Это в значительной степени, поэтому для большинства приложений, если вы открываете файл, вам не нужно вызывать .close() (и использовать уродливые try... finally blocks), и вы будете в порядке - finally() будет освободите его для вас через некоторое время. Однако для некоторых фрагментов кода (например, для интенсивных серверных приложений) освобождение ресурсов с помощью .close() является обязательным, иначе finally() может быть вызван слишком поздно для вас, и вы можете не работать с файловыми дескрипторами.

Тот же метод используется Swing - ресурсы операционной системы для отображения окон и чертежа не освобождаются каким-либо методом .close(), а просто завершают(), поэтому вам не нужно беспокоиться обо всех .close() или .dispose(), например, в SWT.

Однако, когда имеется очень ограниченное количество ресурсов, или вы должны "блокировать" ресурс, чтобы использовать его, также помните "разблокировать" его. Например, если вы создаете блокировку файла в файле, запомните также удалить эту блокировку, иначе никто не сможет прочитать или записать этот файл, и это может привести к взаимоблокировкам - тогда вы не можете полагаться на finalize(), чтобы удалить этот замок для вас - вы должны сделать это вручную в нужном месте.