关闭资源的最佳做法是什么?

What's best practice to close resoures?

我有一个 java class 分配了必须关闭的资源。我真的不知道如何强制执行此操作,我目前的方法是实现接口 AutoCloseable,希望调用者有时调用 close() 并添加一个 boolean 关闭,在开始时检查每个方法,如果 true,该方法抛出 IllegalStateException.

调用者必须调用 close() 并且我必须在每个方法开始时检查关闭都不是很好,是否有一些最佳实践可以避免这种情况?

让你的 class 实现接口 AutoCloseable 对你来说是个好方法,因为它允许在 try-with-resource 语句中使用它。

如果出于某种原因您想限制对象实例未正确关闭以避免泄漏的风险,您可以重写 finalize 方法,如下所示:

@Override
protected void finalize() throws Throwable {
    try {
        this.close();
    } finally {
        super.finalize();
    }
}

警告 1: 实施 finalize 方法必须非常小心,因为它会减慢 GC 的工作速度,因此您需要确保您的代码将很快执行。

警告 2: 不需要调用 finalize 方法,所以不要依赖它 close 你的对象,它只会帮助你为了降低风险,您的对象的用户仍然有责任close正确处理它。