为什么要实现finalize()?

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

我没有接受过CS方面的教育,但我已经用Java专业编程近十年了,我从未见过有人在生产系统中实现finalize()。这并不意味着它没有用处,也不意味着与我共事的人做得对

所以我的问题是,对于实现finalize(),有哪些用例不能通过语言中的另一个进程或语法更可靠地处理

请提供具体的场景或您的经验,简单地重复一本Java教科书或finalize的预期用途是不够的,这不是本问题的目的

您可以将其用作持有外部资源(套接字、文件等)的对象的后盾。实现一个close()方法并记录需要调用它的文档

执行finalize()以执行close()处理(如果检测到尚未完成)。可能会有一些东西被转储到stderr,指出你正在清理一个有问题的来电者

它在特殊情况下提供了额外的安全性。并不是每个调用者每次都会做正确的尝试{}finally{}操作。不幸的是,在大多数环境中都是如此

我同意很少需要它。正如评论者指出的,它伴随着GC开销。只有在长时间运行的应用程序中需要“安全带和吊带”时才使用

我看到,从Java9开始,Object.finalize()已被弃用!他们向我们指出java.lang.ref.Cleanerjava.lang.ref.PhantomReference作为替代方案

发表评论