Java-7的试用式资源是否需要直接分配给变量的闭包?简而言之,这段代码.
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节的理解是,它们是不一样的,必须分配资源。从普通用法的角度来看,这将是令人惊讶的,而且我找不到任何针对该模式的文档警告。
发布于 2014-01-31 16:10:42
这两个块并不等价,因为它们不会生成相同的代码。但是,由于ObjectInputStream.close()将在传递它的ByteArrayInputStream上调用close(),所以第一个块是完全正确的。
编辑:我忘了的是,与new BufferedInputStream(new *InputStream(...))这样的合理构造不同,ObjectInputStream构造函数实际上是从传递它的流中读取的,因此可以合理地抛出异常。由于这个原因,我实际上推荐第二个块,而不是第一个块。
发布于 2014-01-31 16:15:36
代码与您已经提到的不同,因为Java将为每个变量生成一个封闭块,尽管它不是必要的。更重要的是JavaDocs on AutoCloseable的评论:
请注意,与关闭的关闭方法不同,这个关闭方法不需要是幂等的。换句话说,多次调用这个关闭方法可能会产生一些明显的副作用,与Closeable.close不同的是,如果调用不止一次,则不需要有任何效果。但是,强烈鼓励该接口的实现者使其密切的方法成为幂等的。
基本上,这意味着两次调用close()不应该有任何效果,但不能保证。因此,建议避免第二个构造,以避免调用关闭两次。
发布于 2018-05-10 12:49:56
总是使用第二种形式。在第一种形式中,如果数组为空,“()”将引发异常。这将使ByteArrayInputStream打开。
https://stackoverflow.com/questions/21484606
复制相似问题