我读到(某处),finalize()
当子类被垃圾收集时,不能保证调用父类,这是否意味着大多数开发人员finalize()
在子类中重写并调用super.finalize()
?
问问题
6564 次
2 回答
14
不会为超类自动调用 Finalize。因此,如果您覆盖 finalize,确保清理超类的正确方法是
protected void finalize() {
try {
// do subclass cleanup
}
finally {
super.finalize();
}
}
请参阅此参考文章http://www.ibm.com/developerworks/java/library/j-jtp06294/index.html
值得注意的是,终结器不是非常可预测的,您无法控制它们是否/何时运行。在 finalize 方法中不应该做任何关键的事情。一般来说,最好只对你的类进行显式清理。
于 2012-07-07T22:31:28.750 回答
3
最好避免依赖 finalize 来清理任何非 Java 资源(不保证 finalize 调用)。如果可能,请使用 try with resources(如果使用 JDK7)或 try finally 子句在可能的其他选项中清理资源。如果要使用 finalize,可以将 super.finalize 放在 try finally 块中。明智的做法是不要依赖 finalize 来清理资源。
// don't make it public!
protected void finalize() throws Throwable
{
try
{
// custom finalization here
}
finally
{
super.finalize();
}
}
如果这个想法是清理资源,那么检查幻影引用是明智的——如果一个对象既不是强/弱/软可访问的,又是最终确定的,并且至少有一个幻像引用(即对象已完成但尚未回收)。
于 2012-07-07T22:33:23.093 回答