Java 对象“finalize()”是否有正确的用法;不应该依赖于;?

Java 对象“finalize()”是否有正确的用法;不应该依赖于;?,java,Java,自从JDK1.0引入Java以来,Java又引入了9个版本 然而,尽管它很明确,它仍然是可用的,即使在JDK10中也是如此 甲骨文本身声明: finalize()方法 对象类提供了一个回调方法finalize(),该方法可能是 当对象变成垃圾时对其调用。对象的实现 of finalize()不执行任何操作您可以覆盖finalize()来执行清理, 比如释放资源 finalize()方法可以由系统自动调用,但是 它何时被调用,甚至是否被调用,都是不确定的。所以,, 您不应依赖此方法来为自己进行清理

自从JDK1.0引入Java以来,Java又引入了9个版本

然而,尽管它很明确,它仍然是可用的,即使在JDK10中也是如此

甲骨文本身声明:

finalize()方法

对象类提供了一个回调方法finalize(),该方法可能是 当对象变成垃圾时对其调用。对象的实现 of finalize()不执行任何操作您可以覆盖finalize()来执行清理, 比如释放资源

finalize()方法可以由系统自动调用,但是 它何时被调用,甚至是否被调用,都是不确定的。所以,, 您不应依赖此方法来为自己进行清理。对于 例如,如果您在之后不关闭代码中的文件描述符 执行I/O时,您希望finalize()为您关闭它们,您 可能会用完文件描述符

这就引出了一个问题:是否有任何已知的正确的使用此方法?

唯一的“元使用”可能是此API的示例状态:尽管已知并建议不要使用它,但它没有被删除。甚至在Java9之前都不推荐使用

您可以将此简单方法视为Java语言负责人极不愿意破坏向后兼容性的证据。即使是没有人应该使用的方法


所以,实际的答案是:不,没有。当然,您可以使用该方法进行实验,在何种条件下调用它,但您不能依赖于该研究的结果

finalize()
自从Java 9以来就被弃用了,顺便说一句,只是不是为了删除(响应“…它仍然可用,即使在JDK 10中也可用”)。它可能永远不会被删除,以确保它们不会破坏任何东西。谷歌的内部实践页面提到了终结器:1)不要使用它们;2) 如果您认为确实需要使用它们,请仔细阅读有效的Java项目。然后仍然不使用它们。(在某些情况下,您确实需要它们,例如与本机代码交互。但问题是,您需要它们的频率远远低于您最初的想象)。@Slaw“已弃用但可能永远不会删除”是什么意思?:)@WebViewer当项目因某种原因不应使用时,可以将其标记为“已弃用”。在Java中,这是通过注释完成的(Javadoc将详细介绍)。但是,仅仅因为某个项已被弃用,并不意味着它将从库中删除。这是为了确保向后兼容性;用Java8编译的代码应该在Java9上运行。如果不需要或不希望向后兼容,则该项可以标记为“不推荐删除”,这意味着它将在将来的版本中删除。