【发布时间】:2016-06-10 13:20:07
【问题描述】:
我读过的关于 java finalize 方法的所有内容都说 NOT 使用它。似乎它几乎永远不能保证会被调用,即使被调用也可能会出现问题。
还有一些其他问题询问何时使用它,似乎普遍的共识是从不。
我自己从未使用过它(主要是因为警告不要使用),我也没有看到它在任何地方使用过。
有没有合适的情况?有没有其他选择的情况?
如果没有,为什么会出现?是否有内部类使用它并要求该方法可用?还是它只是不应该存在的东西?
我对什么时候应该使用它不太感兴趣(已回答“从不”),但在给出“从不”的答案时澄清为什么它甚至在那里。既然这么没用又这么危险,为什么不被贬值和淘汰呢?
【问题讨论】:
-
@Alex 我的问题很相似,但我认为它并不完全相同。我并没有问那么多为什么我会使用它(我不应该),而是为什么它首先存在(考虑到我不应该)。 java API 是否出于某种原因需要它?出于某种原因,JVM 是否必须在所有对象上查看该方法?或者是否存在根本没有其他选择的情况? (其中第三个由您链接的问题解决,但前两个不是)。
-
@Alex 我编辑了我的标题以使这种区别更加清晰。
-
好吧,JLS 要求它存在,但给出的唯一原因是 Finalizer 提供了释放自动存储管理器无法自动释放的资源的机会。在这种情况下,简单地回收一个对象使用的内存并不能保证它所持有的资源会被回收。 finalize 的 javadoc 还说 finalize 的通常目的是执行清理操作在对象被不可撤销地丢弃之前。我不知道创建它的另一个原因。