清理finalize()或finally()中的代码?

Kev*_*oyd 9 java

我一般认为清理资源是在finally块中完成的,
最近我在类中找到了这个特定的代码片段,它覆盖了Object类的finalize()方法.

protected void finalize() {  
    try {
        In.close(); 
        Out.close();
        socket.close();
    }
    catch (Exception e) {
        //logger code here
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个好主意吗?什么是利弊finalize()finally

Joh*_*don 16

finally块只是一个代码块,总是在try块之后执行,即使存在异常.即它在本地范围内

finalize()方法是一种在垃圾收集时清理整个对象的方法.

finalize()的Java文档

finally解决了代码块中清理资源的问题,无论是否出现异常情况...... finalize()一旦垃圾收集器确定没有更多的引用,这是一种在不再使用对象时清理资源的方法宾语.

简而言之,要回答你的问题,例如,如果你关闭的套接字是一个对象的成员,你应该在finalize()方法中关闭它们(虽然这是次优的,例如,因为GC不能保证将实际执行该操作)

但是,如果您在方法中打开套接字,并且在方法结束时使用它完成,则应释放finally块中的资源.

  • 很好 - 一个带有C#文章的Java问题来回答它.请注意,文章中的详细信息可能与Java相关,也可能与Java不相关. (5认同)

Jos*_*hua 8

总是在最后清理东西.

无法保证最终完成清理.

然而,经常发现在终结器中清理这些东西作为最后一个安全阀,如果最终阻止另外一个例外.

依赖于终结器的真正问题是在GC调用终结器之前可能需要资源的其他东西.


Bil*_*l K 5

幻影引用将做您想要的。

只是不要使用finalize。在少数情况下,它可能会有所帮助(在类为GC时打印调试信息非常方便),但通常没有帮助。JVM合约中没有任何东西说必须调用它。

有一种被称为“参考”的对象,它的公开程度很低。一个明确地针对您认为要用于finalize的事物而制作。

幻影引用对象,在收集器确定可以以其他方式收回其引用对象之后将其排队。”

我突然想到,在Web上必须有对此的描述-因此,我将用该参考文献替换我刚才编写的所有“操作方法”。