工厂创建的实例的AutoCloseable"资源泄漏"警告?

ant*_*tak 10 java eclipse autocloseable

我在Eclipse中获得AutoCloseable的这些"资源泄漏"警告似乎可以节省生命.

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

例如(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 {}
    };
}
Run Code Online (Sandbox Code Playgroud)

是否有我可以坚持的注释newResource()或我可以做的事情让编译器(或者它是Eclipse?)知道所有权的变化?

Ste*_*n C 2

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

所有权/责任

上述诊断基本上假设创建资源类型实例的方法也负责关闭该资源。然而,一些资源将在多种方法之间共享。这里分析做出以下假设:

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

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

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


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

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