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

标签 java netbeans java-7 finalize

我在 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/

相关文章:

intellij-idea - IntelliJ : display folder structure like NetBeans

java - 在 Netbeans 平台中处理和显示没有文件扩展名的文件的最佳方式?

java - 为什么 Java 7 和 Eclipse 3.8 编译器无法使用新的 Java 7 菱形运算符编译 JDK 代码?

java - Spring 3.0 : SQL not committed when exception is thrown

java - Cocol/R 预测解析器实现 Java

java - 将字符串转换为 java.time.localDate

java - 从 Java 8 开始有什么理由写 `new Random()` 吗?

java - 如何在netbeans中更改java数据库应用程序的标题

Java 7 字符串 - 子字符串复杂度

java - 使用 Stanford Topic Modeling Toolkit (TMT) 加载类时出错