【问题标题】:How to address the "Do not override the Object.finalize() method" issue如何解决“不要覆盖 Object.finalize() 方法”问题
【发布时间】:2015-09-19 21:50:47
【问题描述】:

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

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

谁能帮我解决这个问题,覆盖的方法还包含一些业务逻辑。

【问题讨论】:

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


【解决方案1】:

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

UPD 另外:不保证 finalize() 将(在大多数情况下保证不会)在与您的应用程序相同的线程中执行,因此,不同步的代码可能会产生不可预知的结果,同步的代码以及大型业务逻辑可能会减慢 GC 线程的执行速度,从而减慢整个应用程序的速度。

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

因此,总而言之,您的帮助工具说得对:当覆盖 finalize() - 你做错了什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 2014-03-06
    相关资源
    最近更新 更多