12

我在 Eclipse for 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?)知道所有权的变化?

4

1 回答 1

2

关于“资源泄漏”检测的 Neon Eclipse 文档解释了发生了什么;请参阅“避免资源泄漏”。它指出:

所有权/责任

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

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

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

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


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

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

于 2018-03-30T08:05:17.307 回答