如何解决"不要覆盖Object.finalize()方法"问题

时间:2015-07-02 11:28:09

标签: android sonarqube code-analysis static-code-analysis

最近我找到了一个工具[SonarQube]帮助我找出代码中的潜在威胁,我已经解决了该工具报告的所有问题。

但它也给了我一个潜在的威胁问题" protected void finalize()"被我覆盖的方法,工具显示一条消息"不要覆盖Object.finalize()方法"。

任何人都可以帮我解决这个问题,覆盖的方法还包括一些业务逻辑。

1 个答案:

答案 0 :(得分:1)

从不。决不! 从不 finalize()中放置任何业务逻辑。覆盖 finalize()的唯一情况是当您的对象分配一些资源时,您忘记释放。在这种情况下,你的finalize()可以检查仍然分配的资源,强制它们释放,并在日志中警告它,或类似的东西。但在任何正常情况下,您都不需要覆盖它。 此外,您无法保证,在最后确定时将调用。因此,您可能会将未完成对象保留在堆中直到世界末日,或者反之亦然,您的对象可以在引用丢失后立即完成。另外,不能保证最终确定对象的顺序。无论您的业务逻辑包含什么,我想,这不是您想要的。

UPD 此外:无法保证 finalize()(在大多数情况下保证不会)与您的应用程序在同一个线程中执行,因此如果代码不同步,可能会产生不可预测的结果,同步代码,大型业务逻辑也会降低GC线程的执行速度,从而降低整个应用程序的速度。

不是覆盖 finalize(),而是实现一些显式方法(例如 close() done()),你会完成此对象时显式调用。 此外,在有限资源设备下进行开发时,最好通过多个调用init / done方法来重用对象,这样可以重用内部结构,而无需进行不必要的垃圾回收。

总而言之,你的帮助工具说得对:当重写 finalize()时 - 你做错了。