我在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点解释了为什么newResource
方法中的return
语句没有"资源泄漏"警告。
第3点解释了为什么newResource()
调用没有"资源泄漏"警告。充其量,这只是一个"潜在的资源泄漏"警告。要么您禁用了这些警告,要么上一个警告正在禁止它。
Q: 是否有注释告诉Eclipse资源所有权的转移?
A: NeonEclipse文档没有提到任何这样的注释。(它确实详细介绍了用于null检查的注释!)