自动关闭 出厂创建的实例的"resource leak"警告?



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

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

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

所有权/责任

上述诊断基本上假设资源类型的实例也负责关闭资源然而,一些资源将在几个方法。在这里,分析做出了以下假设:

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

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

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


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

A: NeonEclipse文档没有提到任何这样的注释。(它确实详细介绍了用于null检查的注释!)

相关内容

  • 没有找到相关文章

最新更新