为什么不尝试使用资源来处理字段变量?

Con*_*Map 26 java java-7 try-with-resources

这是我关于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();
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

愿任何人解释我为什么有这个约定?

Mar*_*nik 16

在try-with-resources块的执行期间,可以在任何时刻改变实例变量.这将破坏其不变性并防止清理.请注意,出于同样的原因,局部变量显然是最终的.

BTW一个更好的问题是,为什么Java 强制我们声明一个局部变量,即使我们在块中没有引用它.例如,C#不需要这样.


Pet*_*rey 8

我怀疑设计师认为使用字段是一个坏主意,因为这允许对象逃离使用区域.即它仅在try块中有效,因此您无法在其他任何地方访问它.

  • 是的,试过了.在try-with-resources中声明的变量是隐式最终的.具体来说,Eclipse会出现此错误:"无法分配try-with-resources语句的资源<var-name>".与最终变量不同. (3认同)
  • 它也可以通过这种方式逃脱.关键是要有一个最终变量,保证在try-with-resources结束之前保持相同的值. (2认同)