gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:03:03 33 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

关于android - 如何解决 "Do not override the Object.finalize() method"问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31183341/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com