如何解决 "Do not override the Object.finalize() method" 问题

How to address the "Do not override the Object.finalize() method" issue

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

但它也给我带来了 "protected void finalize()" 方法的潜在威胁问题,该方法已被我覆盖,工具向我显示一条消息 "Do not override the Object.finalize() method"。

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

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

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

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

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