是否需要java的finalize方法?
我读到的关于java finalize方法的所有内容都说不能使用它。似乎它几乎从未保证会被调用,甚至在调用时也可能出现问题
还有一些其他问题会问什么时候使用它,而且似乎普遍的共识是永远不会
我自己从来没有使用过它(主要是因为警告不要使用),我也没有在任何地方看到过它
是否有合适的情况?是否存在没有其他选择的情况
如果没有,为什么会有?是否有内部类使用它并要求该方法可用?或者只是一些不该出现的东西
我对什么时候应该使用它(答案是“从不”)不太感兴趣,但我想澄清一下为什么它会出现,因为答案是“从不”。如果它是如此无用和危险,为什么它没有被贬值和删除
# 1 楼答案
您可以使用它并且可以接受它的一个用例是释放不在JVM控制下的资源,也就是说,如果没有JVM,这些资源将不会被释放。例如,使用
sun.misc.Unsafe
(*)分配的内存必须手动释放,因为它不会被垃圾收集。因此,如果以前没有释放过内存,您可以使用finalize
方法作为最后的手段来释放内存-只是为了确保您的程序没有内存泄漏。但是这些情况非常罕见,现在Java提供了更好的替代方案,如Java7中引入的AutoClosable
接口您可以在OpenJDK源代码中找到更多示例,例如FileInputStream,它使用
finalize
方法确保它被关闭(*)不要使用它,它之所以被称为
Unsafe
是有原因的编辑:回答您评论中的问题
java API出于某种原因需要它吗强>
是和否。Java Language Specification表示它必须存在。Java库中的一些类也使用它(例如,当它们处理文件时),但是没有Java API要求您为类实现它
出于某种原因,JVM必须在所有对象上看到该方法吗强>
是的,因为JLS这么说,垃圾收集器为它收集的每个对象调用它
但是它确实在所有对象上看到了
finalize
方法,因为Object
implements it-并且它对每个默认值都不做任何操作# 2 楼答案
向后兼容性。有人最初认为这是一个好主意,但当全世界意识到这不是一个好主意时,为时已晚
这些东西几乎从未被移除过。Java充满了如今被认为是坏主意但却没有被删除的概念——我想到的更多例子是^{} 或^{}