【问题标题】:AutoCloseable "resource leak" warning for factory created instances?工厂创建的实例的自动关闭“资源泄漏”警告?
【发布时间】:2014-06-09 03:20:48
【问题描述】:

我在 Eclipse 中为AutoCloseables 收到的这些“资源泄漏”警告似乎是救命稻草。

但是,如何让它们为工厂创建的实例工作?

例如(a 有效,但 b 无效):

public static void main(String[] args) {
    // a) This emits a warning
    new AutoCloseable() {
        @Override
        public void close() throws Exception {}
    };

    // b) But this doesn't!
    newResource();
}

public static AutoCloseable newResource() {
    return new AutoCloseable() {
        @Override
        public void close() throws Exception {}
    };
}

有没有我可以在newResource() 上粘贴的注释,或者我可以做些什么来让编译器(或者是 Eclipse?)知道所有权的变化?

【问题讨论】:

  • 如果忽略某些返回值,Intellij 通常会发出警告。这可能会有所帮助,因为您不必在本地分配值。

标签: java eclipse autocloseable


【解决方案1】:

关于“资源泄漏”检测的 Neon Eclipse 文档解释了发生了什么;见"avoiding resource leaks"。它指出:

所有权/责任

上述诊断基本上假设一个方法创建一个 资源类型的实例也负责关闭这个 资源。但是,一些资源将在几个人之间共享 方法。这里的分析做了以下假设:

  1. 如果一个方法返回一个资源给它的调用者,它不负责关闭;没有报告任何问题。
  2. 如果资源存储在字段中,则没有一个方法被认为负责关闭;没有报告任何问题。
  3. 如果方法通过方法调用而不是通过新的表达式获取资源,它可能负责也可能不负责;任何问题都是 仅标记为潜在的资源泄漏。
  4. 如果在方法调用或构造函数调用中将资源作为参数传递,则当前方法可能负责也可能不负责; 任何问题都只会被标记为潜在的资源泄漏。

第 1 点解释了为什么 return 方法中的 return 语句没有“资源泄漏”警告。

第 3 点解释了为什么newResource() 调用没有“资源泄漏”警告。充其量,这将是一个“潜在的资源泄漏”警告。要么您禁用了这些警告,要么之前的警告正在禁止它。


问:是否有注释告诉 Eclipse 关于资源所有权的转移?

答:Neon Eclipse 文档没有提到任何此类注释。 (它确实详细介绍了用于空检查的注释!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-07
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2016-09-23
    • 1970-01-01
    相关资源
    最近更新 更多