为什么尝试资源不能与字段变量一起使用?

2022-09-01 13:12:38

这是我关于SO的第一个问题,我很困惑还没有类似的问题!

所以问题是:

为什么尝试资源不能与字段变量一起使用?

或者换句话说:为什么我总是需要一个局部变量?

下面是一些示例代码:

public class FileWriteTest {

    public FileWriter file;

    public void workingDemo() {

        try(FileWriter file = new FileWriter(new File("someFilePath")) {
            // do something
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public void notWorkingDemo() {

        file = null;

        try(file = new FileWriter(new File("someFilePath")) {
            // do something
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

谁能解释一下为什么会有这个惯例?


答案 1

在执行资源试用块期间,可以随时更改实例变量。这将破坏其不变性并阻止清理。请注意,出于同样的原因,局部变量是隐含的最终变量。

顺便说一句,一个更好的问题是,为什么Java强迫我们声明一个局部变量,即使我们不在块中引用它。例如,C#不需要这个。

更新:在版本9中,Java已经停止强迫我们:

private final Some obj = new Some();

try (obj) { 
  // obj captured in a hidden local variable, resource closed in the end
}

答案 2

我怀疑设计师认为使用字段是一个坏主意,因为这允许对象逃脱使用区域。也就是说,它仅在try块中有效,因此您不应该在其他任何地方访问它。


推荐