gpt4 book ai didi

java - 为什么 Netbeans 警告我完成?

转载 作者:行者123 更新时间:2023-11-29 07:00:18 25 4
gpt4 key购买 nike

我在 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()

我没有覆盖任何其他方法,如 equals 或任何东西(也许我应该?)。你能告诉我为什么我会收到这个警告吗?

最佳答案

finalize 方法存在一个问题,即它们可能会在任意时间被任意线程调用,甚至根本不会被调用。喜欢discussed in this question它们可能会被提前调用,即当实例方法仍在执行时,因此使用它们来释放资源是非常危险的。

因此,如果它们对它们的最初用途没有真正的用处,那么在您使用它们时始终发出警告是合法的。


如果你想实现清理资源的代码,当客户端代码忘记调用 closedispose 或任何你提供的显式资源管理(你如果有关联的 native 资源,则应该)可以使用 PhantomReference 来完成到实例和 ReferenceQueue

优点是您可以控制何时轮询队列和执行清理,您甚至可以通过让 PhantomReference 超出范围来选择退出事后清理(它将在客户端代码没有忘记调用close的情况下通常被收集而不是入队(强烈建议实现AutoClosable以允许使用try with resources”) .因此,这也解决了一个小的性能问题,即具有非平凡 finalize 方法的对象必须被收集两次,因为执行 finalize 方法意味着它们再次变得可访问。

关于java - 为什么 Netbeans 警告我完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27270777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com