我有一个ResultSet支持的Iterator。我需要做行级的后处理。迭代器实现AutoCloseable整数。连接一直保持打开状态,直到我们遍历被用户中断的所有行/迭代。如果迭代器的使用者显式调用close()方法或将迭代器的使用包装在Java7 try块中,那么一切都很好。但是,如果使用者不这样做,我不能保证连接将返回到池中。在C#世界中,我们将执行终结器并从终结器调用Dispose(bool)作为后备选项。我们应该用Java来做同样的事情吗?
发布于 2015-03-11 10:44:38
这种清理通常不是在Java finalize()
方法中完成的(自Java9起就不再推荐了)。未能确保正确处理资源是编程错误;尝试在错误编程之后进行清理将使错误做法得以继续。
更常见的是一个调试选项,可以帮助已经承认自己有问题的开发人员。通常在默认情况下这是不启用的,因为涉及到开销,但是当打开正确的标志时,当资源被分配时会创建堆栈跟踪。如果在未正确销毁资源的情况下调用finalize()
,则记录堆栈以显示泄漏的位置。
关于finalize()
有许多警告,您通常应该避免它。本例中的主要问题之一是无法保证它将被调用,即使是这样,也可能没有及时提供帮助。
https://stackoverflow.com/questions/28994628
复制