java的finalize方法有必要吗?

Is there any need for java's finalize method?

我读到的关于 java finalize 方法的所有内容都说 NOT 使用它。似乎它几乎永远无法保证被调用,即使被调用也可能会出现问题。

还有一些其他问题询问何时使用它,似乎普遍的共识是 从不

我自己从未使用过它(主要是因为警告不要使用),我也没有看到它在任何地方使用过。

有没有适合的情况?有没有别无选择的情况?

如果不是,为什么会在那里?是否有内部 类 使用它并要求该方法可用?或者它只是不应该存在的东西?

我对什么时候应该使用它不太感兴趣(已用 "never" 回答),但澄清为什么它甚至在那里给出 "never" 的回答。如果它如此无用和危险,为什么不贬值和移除它?

一个您可能会使用它并且可以接受的用例是释放不受 JVM 控制的资源,即否则不会释放的资源。例如,使用 sun.misc.Unsafe(*) 分配的内存必须手动释放,因为它不会被垃圾回收。所以你可以使用 finalize 方法作为释放内存的最后手段,如果它之前没有被释放 - 只是为了确保你的程序没有内存泄漏。但是这些情况很少见,今天 Java 提供了更好的替代方案,例如 Java 7.

中引入的 AutoClosable 接口

您可以在 OpenJDK 源代码中找到更多示例,例如 FileInputStream 使用 finalize 方法来确保它已关闭。

(*) 不要使用它,它被称为 Unsafe 是有原因的。

编辑: 回答您评论中的问题

java API 出于某种原因需要它吗?

是也不是。 Java Language Specification 声明它必须存在。 Java 库中的某些 类 也使用它(例如,当它们处理文件时)但没有 Java API 要求您为您的 类 实现它。

JVM 是否出于某种原因必须在所有对象上看到该方法?

好吧,是的,因为 JLS 是这么说的,垃圾收集器会为它收集的每个对象调用它。

Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.

但它确实在自 Object implements it 以来的所有对象上看到了 finalize 方法 - 默认情况下它不执行任何操作。

protected void finalize() throws Throwable { }

向后兼容。有人首先认为这是一个好主意,然后当世界意识到这不是一个好主意时,为时已晚。

这些东西几乎从未被移除。 Java 充满了现在被认为是坏主意但仍未被删除的概念 - 我想到的更多示例是 clone() or Thread.stop()