如何解决“不要覆盖Object.finalize()方法”问题(How to address the

2019-10-23 14:44发布

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

但是,这也让我对“保护无效的finalize()”方法,它是被我超越,工具显示我的消息“不要覆盖Object.finalize()方法”一潜在威胁的问题。

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

Answer 1:

决不。 决不! 从来没有把任何业务逻辑的finalize()。 唯一的情况下覆盖的finalize()是当你的对象分配一些资源,你忘记释放。 在这种情况下,您的finalize()可以检查的资源仍然被分配,迫使他们释放,并在日志中发出警告,或者类似的东西。 但在任何正常情况下,你不需要覆盖它。 此外,您也无法保证,在完全相同的时刻敲定将被调用。 所以,你可能有未确定的对象保持在堆中,直到世界的尽头,或者,反之亦然,你的对象可以尽快基准丢失敲定。 在另外的,它不能保证,在这种秩序对象将被敲定。 无论你的业务逻辑中包含的,我想,这是不是你想要的。

UPD另外:它是不能保证的finalize()会(在大多数情况下可以保证不会)在同一个线程的应用程序来执行,因此,具有不同步的代码有可能使不可预知的结果,同步码,也大业务逻辑可以减缓GC线程的执行,并因此减缓整个应用程序。

相反压倒一切的finalize()的,执行一些明确的方法(例如接近(),进行()),当其与该对象做,你会明确要求。 此外,在资源有限的设备开发的时候,它是重用由多个在调用init /做方法,它允许重复使用内部结构的物体的良好做法,避免不必要的垃圾回收。

所以,总而言之,你的帮助工具说的对:重写完成() -你正在做的事情是错误的。



文章来源: How to address the “Do not override the Object.finalize() method” issue