我收到SonarQube错误:“强制建议在此方法实现结束时调用super.finalize()
,以防父实现必须也处置一些系统资源。”
但我发现Object
类没有实现finalize方法。
protected void finalize() throws Throwable { }
那么为什么需要拨打super.finalize()
?
答案 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()
对于清除父级引用的引用非常有用。