Ответ 1
Если ваш Java-объект использует JNI для указания собственного кода для выделения собственной памяти, вам нужно использовать finalize, чтобы убедиться, что он освобожден.
Это в основном из любопытства.
Я блуждал, если кто-нибудь столкнулся с каким-либо хорошим использованием для Object.finalize(), за исключением целей отладки/регистрации/профилирования?
Если вы не столкнулись ни с чем, что бы вы сказали, хорошее использование было бы?
Если ваш Java-объект использует JNI для указания собственного кода для выделения собственной памяти, вам нужно использовать finalize, чтобы убедиться, что он освобожден.
Поздно к вечеринке здесь, но я думал, что все еще буду звонить:
Одним из лучших применений, которые я нашел для финализаторов, является вызов явных методов завершения, которые по какой-либо причине не были вызваны. Когда это происходит, мы также регистрируем проблему, потому что это BUG!
Потому что:
Это оставляет только несколько задач, с которыми они могут обращаться без особого риска.
Но это просто резерв, который используется, "нормальный" механизм не работает. Нормальный механизм должен быть инициирован явно.
Я использую его для записи данных в базу данных при использовании мягких ссылок для кэширования объектов с поддержкой базы данных.
Выпустите ресурсы, которые должны быть выпущены вручную в обычных обстоятельствах, но по какой-то причине не были выпущены. Возможно, с записью предупреждения в журнал.
Я вижу одно хорошее использование для finalize(): освобождение ресурсов, которые доступны в больших количествах и не являются исключительными.
Например, по умолчанию для процесса Linux доступно 1024 файла и около 10000 для Windows. Это в значительной степени, поэтому для большинства приложений, если вы открываете файл, вам не нужно вызывать .close() (и использовать уродливые try... finally blocks), и вы будете в порядке - finally() будет освободите его для вас через некоторое время. Однако для некоторых фрагментов кода (например, для интенсивных серверных приложений) освобождение ресурсов с помощью .close() является обязательным, иначе finally() может быть вызван слишком поздно для вас, и вы можете не работать с файловыми дескрипторами.
Тот же метод используется Swing - ресурсы операционной системы для отображения окон и чертежа не освобождаются каким-либо методом .close(), а просто завершают(), поэтому вам не нужно беспокоиться обо всех .close() или .dispose(), например, в SWT.
Однако, когда имеется очень ограниченное количество ресурсов, или вы должны "блокировать" ресурс, чтобы использовать его, также помните "разблокировать" его. Например, если вы создаете блокировку файла в файле, запомните также удалить эту блокировку, иначе никто не сможет прочитать или записать этот файл, и это может привести к взаимоблокировкам - тогда вы не можете полагаться на finalize(), чтобы удалить этот замок для вас - вы должны сделать это вручную в нужном месте.