6

Java-7 的 try-with-resources 是否需要将可关闭对象直接分配给变量?简而言之,这个代码块是...

    try (final ObjectInputStream ois = new ObjectInputStream(
            new ByteArrayInputStream(data))) {
        return ois.readObject();
    }

相当于这个块?...

    try (final ByteArrayInputStream in = new ByteArrayInputStream(data);
         final ObjectInputStream ois = new ObjectInputStream(in)) {
        return ois.readObject();
    }

我对Java 语言规范第 14.20.3 节的理解说它们不一样,必须分配资源。从常见用法的角度来看,这将是令人惊讶的,我找不到任何针对该模式的文档警告。

4

3 回答 3

6

这两个块在它们不会生成相同代码的意义上是不等价的。但是由于ObjectInputStream.close()会调用你传递close()ByteArrayInputStream那个,所以第一个块完全没问题。

编辑:我忘记的是,与合理new BufferedInputStream(new *InputStream(...))的构造不同,ObjectInputStream构造函数实际上是从您传递的流中读取的,因此可以合理地抛出异常。出于这个原因,我实际上会推荐第二个区块,而不是第一个区块。

于 2014-01-31T16:10:42.503 回答
2

该代码与您已经提到的代码不同,因为即使没有必要,Java 也会为每个变量生成一个关闭块。更重要的是 JavaDocs 关于 AutoCloseable 的评论:

请注意,与 Closeable 的 close 方法不同,此 close 方法不需要是幂等的。换句话说,多次调用此 close 方法可能会产生一些可见的副作用,这与 Closeable.close 不同,如果多次调用则要求无效。但是,强烈建议此接口的实现者使他们的 close 方法具有幂等性。

基本上这意味着调用close()两次应该没有任何效果,但不能保证。因此,建议避免使用您提出的第二个构造,以避免两次调用 close。

于 2014-01-31T16:15:36.907 回答
0

始终使用第二种形式。在第一种形式中,如果数组为空,“new ObjectInputStream()”将抛出异常。这将使 ByteArrayInputStream 保持打开状态。

于 2018-05-10T12:49:56.707 回答