0

我有一个由 ResultSet 支持的迭代器。我需要它来进行行级后处理。迭代器实现 AutoCloseable 接口。连接保持打开状态,直到我们遍历所有被用户中断的行/迭代。如果迭代器的使用者显式调用 close() 方法或将迭代器的使用包装在 Java7 的 try 块中,那么一切都很好。但是,如果消费者不这样做,我不能保证连接将返回到池中。在 C# 世界中,我们会做一个终结器并从终结器调用 Dispose(bool) 作为后备选项。我们应该在 Java 中做同样的事情吗?

4

1 回答 1

2

这种清理通常不在 Javafinalize()方法中完成。未能确保正确处置资源是编程错误;尝试在糟糕的编程之后进行清理会导致不良做法的延续。

更常见的是一个调试选项,可以帮助已经承认有问题的开发人员。由于涉及开销,通常默认情况下不启用此功能,但是当打开正确的标志时,会在分配资源时创建堆栈跟踪。如果finalize()在没有正确销毁资源的情况下调用,则会记录堆栈以显示泄漏的位置。

周围有许多警告finalize(),您通常应该避免它。这种情况下的主要问题之一是不能保证它会被调用,即使是,它也可能无法及时提供帮助。

于 2015-03-11T18:44:38.533 回答