这些"资源泄漏"警告我在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?)知道所有权变更?
答案 0 :(得分:1)
关于“资源泄漏”检测的Neon Eclipse文档解释了正在发生的事情;见"avoiding resource leaks"。它声明:
所有权/责任
上述诊断基本上假设一个创建一个的方法 资源类型的实例也负责关闭它 资源。但是,一些资源将在几个资源之间共享 方法。这里的分析做出以下假设:
- 如果方法将资源返回给其调用者,则它不负责关闭;没有问题报道。
- 如果资源存储在字段中,则没有一种方法被视为负责关闭;没有问题报道。
- 如果方法通过方法调用而不是通过新表达式获取资源,则它可能负责也可能不负责;任何问题都是 仅被标记为潜在的资源泄漏。
- 如果资源在方法调用或构造函数调用中作为参数传递,则当前方法可能负责也可能不负责; 任何问题都只被标记为潜在的资源泄漏。
醇>
第1点解释了为什么return
方法中的newResource
语句没有“资源泄漏”警告。
第3点解释了为什么newResource()
呼叫没有“资源泄漏”警告。充其量,这将是一个“潜在的资源泄漏”警告。您可以禁用这些警告,或者之前的警告是禁用警告。
问:是否有注释告诉Eclipse有关资源所有权的转移?
答:Neon Eclipse文档没有提到任何这样的注释。 (它确实详细介绍了空检查的注释!)