作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个由结果集支持的迭代器。我需要它来进行行级后处理。迭代器实现 AutoCloseable 接口(interface)。连接保持打开状态,直到我们迭代被用户中断的所有行/迭代。如果迭代器的使用者显式调用 close() 方法或者将迭代器的使用包装在 Java7 try block 中,则一切都很好。但是,如果消费者不这样做,我无法保证连接将返回到池中。在 C# 世界中,我们将执行终结器并从终结器中调用 Dispose(bool) 作为后备选项。我们应该在 Java 中做同样的事情吗?
最佳答案
这种清理通常不会在 Java finalize()
方法中完成。未能确保正确处置资源是一个编程错误;尝试在不良编程后进行清理会导致不良做法的继续。
更常见的是调试选项,可以帮助承认存在问题的开发人员。通常,由于涉及开销,默认情况下不会启用此功能,但是当打开正确的标志时,会在分配资源时创建堆栈跟踪。如果在没有正确销毁资源的情况下调用finalize()
,则会记录堆栈以显示泄漏的位置。
关于 finalize()
有许多警告,通常应该避免使用它。本例中的主要问题之一是无法保证它会被调用,即使被调用,也可能无法及时提供帮助。
关于java - ResultSet 的 AutoCloseable Iterator 是否应该从终结器调用关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28994628/
据我所知,不能保证 Object.finalize() 总是被调用。但是如果有重要的非GC资源,并且用户没有意外调用close(),我该如何释放该资源?PS。 .NET中的Object.Finaliz
我是一名优秀的程序员,十分优秀!