最近,我发现了一个工具SonarQube,它帮助我找出代码中潜在的威胁,我已经解决了该工具报告的所有问题。
但是,它也给了我一个潜在的威胁问题:“受保护的void ()”方法被我重写,工具显示一条消息“不要覆盖Object.finalize()方法”。
请任何人帮助我如何解决这个问题,过度的方法也包括一些业务逻辑。
发布于 2015-07-02 15:00:46
绝不可能。绝不!从不将任何业务逻辑放入finalize()中。重写finalize()的唯一情况是当对象分配一些资源时,您忘记了释放这些资源。在这种情况下,您可以检查是否仍然分配了资源,强制释放资源,并在日志中发出警告,或者类似的情况。但在任何正常情况下,你都不需要覆盖它。而且,您没有得到保证,在确切的时刻,finalize将被调用。因此,您可能会将未完成的对象保留在堆中,直到世界末日,或者,反之亦然,一旦失去引用,您的对象就可以完成。此外,这并不是保证,顺序对象将被最后确定。不管您的业务逻辑包含什么,我想,这不是您想要的。
UPD还:不能保证finalize()将在与应用程序相同的线程中执行(在大多数情况下保证不会),因此,有了不同步的代码,可能会产生不可预测的结果,同步代码,以及大型业务逻辑也会减慢GC-线程的执行速度,从而减缓整个应用程序的执行速度。
而不是覆盖finalize(),而是实现一些显式方法(例如close()或done()),在使用此对象完成时将显式调用这些方法。此外,在有限的资源设备下开发时,通过多个调用init/ to方法重用对象是很好的做法,这允许重用内部结构,而无需不必要的垃圾收集。
因此,最后,您的帮助工具说对了:当重写finalize()时,您做了一些错误的事情。
https://stackoverflow.com/questions/31183341
复制相似问题