【问题标题】:What's best practice to close resoures?关闭资源的最佳做法是什么?
【发布时间】:2016-05-30 19:16:36
【问题描述】:

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

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

【问题讨论】:

  • 你的问题不清楚。说清楚了,分享代码sn-p。这将有助于我们了解您的问题
  • “希望”??只需记录您的类,以便您基本上说“如果您不关闭()此类,则行为未定义;请使用 try-with-resources 语句”。工作完成。
  • 我能想到的唯一最佳做法是“确保你这样做”。如果使用您的代码的人不这样做,那是他们的问题。我要添加的唯一另一件事是“仅关闭您打开的资源”。

标签: java resources autocloseable


【解决方案1】:

在您的情况下,让您的类实现接口 AutoCloseable 是一个好方法,因为它允许在 try-with-resource 语句中使用它。

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

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

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

警告2: finalize 方法不是必须调用的,所以不要依赖它来为您的对象提供close,它只会帮助降低风险,您的对象的用户还是有责任好好close吧。

【讨论】:

  • Finalizer 方法不能保证总是被调用,所以如果资源真的必须总是被关闭,那么这不是 100%解决方案。
  • 我的回答是:在Java 中没有enforce 的好方法,让类的用户负责调用close() 方法。我同意实现AutoCloseable 是一个好主意,这至少应该给用户一个提示,即需要调用close()
  • @Jasper 我更新了答案以添加警告,请再次检查
猜你喜欢
  • 1970-01-01
  • 2010-09-30
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多