我得到了SonarQube错误:“强烈建议在此方法实现的末尾调用super.finalize(),以防父实现也必须释放某些系统资源。”
但是我发现Object类没有定案方法的实现。
protected void finalize() throws Throwable { }那么为什么要调用super.finalize()
发布于 2015-08-13 10:45:21
这不是一种需要,而是一个应该遵循的终结者写作成语。
如果在将来的任何时候重构您的代码,并且您的类扩展了可能具有finalize方法的其他类,则此实践将防止出现奇怪的bug。
成语是
try {
// Do whatever the finalization is
}
finally {
super.finalize();
}这确保了即使抛出一些异常(因为没有捕获终结器中的异常,它们的执行就会停止),也会调用超类终结器(如果曾经有一个非平凡的类终结器)。
当然:避免终结器。(约书亚·布洛赫的“有效Java”第二版第7项)。
发布于 2015-08-13 10:40:23
类对象的finalize方法不执行特殊操作;它只是正常返回。对象的子类可以重写此定义。
谁知道,您当前类的super类的ovveriden这个方法。
查看您在下面的层次结构中的位置。
Object --- no implementation
--
-- Your Super class -- Overriden the finalize
-- Current classSuper并不总是表示Object类。中间可能没有超级阶级。
发布于 2015-08-13 10:48:17
SonarQube错误也清楚地声明了。请考虑您编写的类在任何时候都可能具有父层次结构。清理资源总是在上面的层次结构上查找,以便进行有效的清理。因此,无论您是否有一个超类,使用super.finalize()对于清除来自父类的引用都很有用。
https://stackoverflow.com/questions/31985830
复制相似问题