我在Java7中实现了一个类。它不会继承/实现任何东西。它使用Tess4J所以我认为最终释放资源会很好。所以我像这样覆盖了finalize()方法:
@Override
protected void finalize() throws Throwable
{
try
{
TessAPI1.TessBaseAPIDelete(handle);
}
catch(Throwable t)
{
throw t;
}
finally
{
super.finalize();
}
}
Netbeans 8.0.2告诉我这个方法的警告:
finalize declared()
Netbeans网站上的描述对我来说没什么用处:
warns about implementation of Object.finalize()
我没有覆盖任何其他方法,如平等或任何东西(也许我应该?)。 你能告诉我为什么会收到这个警告吗?
答案 0 :(得分:4)
finalize
方法存在的问题是它们可能在任意时间由任意线程调用,甚至根本不会调用。和discussed in this question一样,它们可能会很早就被调用,即当实例方法仍在执行时,因此使用它们来释放资源是非常危险的。
因此,如果它们对于它们的最初目的并不是真正有用,那么在使用它们时始终发出警告是合法的。
如果要实现清理资源的代码,当客户端代码忘记调用close
或dispose
或您为显式资源管理提供的任何内容时(如果存在关联的本机,则应该这样做)资源)可以使用PhantomReference
到实例和ReferenceQueue
。
优点是您可以控制何时轮询队列并执行清理,甚至可以通过让PhantomReference
超出范围来选择退出事后清理(通常会收集它)如果客户端代码不,则忘记致电close
(强烈建议您实施AutoClosable
以允许使用“try
with resources”),并且不加入队列。因此,这也解决了一个小的性能问题,即必须收集具有非平凡finalize
方法的对象,因为执行finalize
方法意味着它们再次可以访问。
答案 1 :(得分:2)
一般来说,大多数Java程序员从来没有理由实现finalize()
,因为他们自己的代码只使用已经管理的类(因此有自己的终结器)。 (见问题下面的评论)。
有些开发人员可能不知道垃圾收集器是如何工作的,因此依赖于finalize()
来完成应该在其他地方完成的清理工作。这种错误尤其会导致在测试中不被注意的缺陷,但会导致生产失败。
出于这个原因,我认为关于finalize()
的警告是恰当的。
答案 2 :(得分:0)
finalize()。所以资源可能没有按你的意愿发布。
最后使用try。