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

时间:2014-04-24 02:31:25

标签: java eclipse autocloseable

这些"资源泄漏"警告我在AutoCloseable中进入Eclipse似乎可以节省生命。

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

例如(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?)知道所有权变更?

1 个答案:

答案 0 :(得分:1)

关于“资源泄漏”检测的Neon Eclipse文档解释了正在发生的事情;见"avoiding resource leaks"。它声明:

  

所有权/责任

     

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

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

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

第3点解释了为什么newResource()呼叫没有“资源泄漏”警告。充其量,这将是一个“潜在的资源泄漏”警告。您可以禁用这些警告,或者之前的警告是禁用警告。

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

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