工厂创建的实例的自动关闭“资源泄漏”警告?

2022-09-04 23:25:41

我在Eclipse中得到的这些“资源泄漏”警告似乎是一个救命稻草。AutoCloseable

但是,如何使它们适用于工厂创建的实例?

例如( 有效,但不有效):ab

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 {}
    };
}

有没有一个我可以坚持的注释,或者我可以做些什么来让编译器(或者它是Eclipse?)知道所有权变更?newResource()


答案 1

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

所有权/责任

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

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

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

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


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

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


答案 2

推荐