一尘不染

Java为什么要实现finalize()?

java

我已经阅读了许多关于Java的新手问题finalize(),发现令人困惑的是,没有人真的说过finalize()是清理资源的不可靠方法。我看到有人评论说他们用它来清理Connections,这确实很吓人,因为要保证Connection关闭的唯一方法就是最终实现try(catch)

我没有在CS上学,但是近十年来我一直在用Java专业编程,而且从未见过有人finalize()在生产系统中实现过。这仍然并不意味着它没有用途,或者与我一起工作的人都在正确地做它。

所以我的问题是,存在哪些用例finalize()无法通过语言中的其他过程或语法更可靠地处理?

请提供特定的方案或你的经验,仅仅重复一本Java教科书,或完成最终的预期用途是不够的,这不是此问题的意图。


阅读 855

收藏
2020-03-06

共1个答案

一尘不染

你可以将其用作保存外部资源(套接字,文件等)的对象的支持。实现close()需要调用的方法和文档。

如果发现尚未完成finalize(),请实施close()处理。也许有一些东西要转而stderr指出你是在有错误的呼叫者之后进行清理。

在特殊/越野情况下,它可提供额外的安全性。并非每个呼叫者每次都会做正确的try {} finally {}事情。不幸的是,但在大多数环境中都是如此。

我同意很少需要它。正如评论者所指出的,它带有GC开销。仅在长期运行的应用程序中需要“皮带和吊带”安全性时使用。

从Java 9开始,我Object.finalize()已经过时了!他们指出,我们java.lang.ref.Cleanerjava.lang.ref.PhantomReference作为替代品。

2020-03-06