首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决“不覆盖Object.finalize()方法”问题

如何解决“不覆盖Object.finalize()方法”问题
EN

Stack Overflow用户
提问于 2015-07-02 11:28:08
回答 1查看 1.9K关注 0票数 2

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

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

请任何人帮助我如何解决这个问题,过度的方法也包括一些业务逻辑。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-02 15:00:46

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

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

而不是覆盖finalize(),而是实现一些显式方法(例如close()或done()),在使用此对象完成时将显式调用这些方法。此外,在有限的资源设备下开发时,通过多个调用init/ to方法重用对象是很好的做法,这允许重用内部结构,而无需不必要的垃圾收集。

因此,最后,您的帮助工具说对了:当重写finalize()时,您做了一些错误的事情。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31183341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档