为什么在重写finalize()方法时首选调用super.finalize()?

时间:2015-08-13 10:37:25

标签: java sonarqube

我收到SonarQube错误:“强制建议在此方法实现结束时调用super.finalize(),以防父实现必须也处置一些系统资源。

但我发现Object类没有实现finalize方法。

protected void finalize() throws Throwable { }

那么为什么需要拨打super.finalize()

3 个答案:

答案 0 :(得分:6)

这不是必要的,而是应该遵循的终结者写作成语。

如果在将来的任何时候,您重构代码并且您的类扩展了其他可能具有finalize方法的类,则此练习将防止出现奇怪的错误。

成语是

try {
   // Do whatever the finalization is
}
finally {
   super.finalize();
}

这确保了超级终结器(如果有一个非平凡的终结器)将被调用,即使抛出了一些异常(因为没有捕获终结器中的异常,它们的执行只会停止)。

当然:避免终结者。 (Joshua Bloch的Effective Java第二版第7项)。

答案 1 :(得分:5)

  

Object类的finalize方法不执行任何特殊操作;它只是正常返回。 Object的子类可以覆盖此定义。

谁知道,super你现在的班级ovveriden这个方法。

查看以下层次结构中的位置。

Object  --- no implementation 

  -- 

    -- Your Super class -- Overriden the finalize 

      -- Current class

Super并不总是代表Object类。中间可能没有超级班。

答案 2 :(得分:1)

SonarQube错误也清楚地说明了。请考虑您编写的类在任何时间点都可能具有父层次结构。为了有效清理,总是在上面查找层次结构以清理资源。无论您是否拥有超级类,因此使用super.finalize()对于清除父级引用的引用非常有用。