И то, и другое можно использовать для очистки, гарантий почти нет, но PR требует большего кодирования упряжи. Итак, имея два варианта, почему именно я должен предпочесть один другому?
Javadoc 9 описывает финализацию как очень проблематичный, но это не делает его альтернативу автоматически лучше, верно?
Также javadoc описывает PhantomReference
как предоставление «более гибких и эффективных способов высвобождения ресурсов, когда объект становится недоступным», но без указания причины. Что ж, думаю, эти ребята знают какие-то секреты, но мне интересно - нельзя ли сделать этот выбор более очевидным?
Разница
Вот все различия между финализацией (FZ) и референсом пантома (PR), которые я обнаружил, пожалуйста, поправьте меня, если я что-то упустил.
Может использоваться для действий по очистке?
- Yes for both.
Требуется поддерживать новый поток?
- PR: yes, you must define a queue watcher thread in order to do cleanup ASAP
- FZ: no
Требуется новый класс для определения?
- PR: yes, you must extend
PhantomReference
to act meaningfully - FZ: no
- PR: yes, you must extend
Может ли процессор очистки получить доступ к референтному объекту?
- PR: no
- ФЗ: да, и это удобно
Надежно ли это работает в моей личной практике?
- Yes for both.
Может привести к проблемам с производительностью, взаимоблокировкам и зависаниям?
- Yes for both. Depends on your code, isn't?
Могут ли ошибки в процессоре очистки привести к утечке ресурсов?
- Yes for both. Depends on your code, isn't?
Можно отменить, если в этом больше нет необходимости?
- PR: yes
- ФЗ: нет, если говорить строго, но сразу
return
это плохо?
Указан ли порядок вызовов между несколькими экземплярами?
- PR: no info
- FZ: no - "не указан порядок среди вызовов финализации методов разных объектов" (java.lang.Object)
Вызов гарантирован?
- PR: no info - you can only "request to be notified of changes in an object's reachability" (java.lang.ref)
- FZ: нет — «Метод finalize может быть вызван для финализируемого объекта только после неопределенной задержки, если вообще будет вызван» (java.lang.Object)
Есть какие-то гарантии по срокам?
- PR: no - "Some time after the garbage collector determines that the reachability of the referent has changed to the value corresponding to the type of the reference" (java.lang.ref)
- FZ: нет — «Язык программирования Java не указывает, как скоро будет вызван финализатор» (JLS), «Метод finalize может быть вызван для финализируемого объекта только после неопределенной задержки, если вообще будет вызван» (java.lang. Объект)
Может ли
this
воскреснуть во время обработки?- PR: no, and that's not bad
- ФЗ: да, официально поддерживается