假设我创建了一些资源类,其中包含用于清理资源的 close() 方法,如果有人忘记调用 close(),我想重写 finalize() 以释放资源(并打印警告)。如何正确地做到这一点?
- 是否仅推荐用于本机(JNI 分配的)资源?
- 如果你从终结器中使用对另一个已经终结的对象的引用会发生什么?如果存在循环依赖关系,我看不出垃圾收集器如何阻止您访问可能已执行终结器的对象。
- 是否有更好的替代方法来覆盖 finalize() 来检测和/或处理资源泄漏?
- 在实现终结器时还有其他需要注意的陷阱吗?
注意:我知道使用 finalize() 通常是个坏主意,并且不能保证会被调用,还有其他几个问题在讨论这个问题。这个问题专门关于如何在 Java 中实现终结器,而不是关于为什么应该(或不应该)。