为什么Java 7特别引入了AutoCloseable?

时间:2014-11-11 13:44:19

标签: java autocloseable

AutoCloseable在jdk1.7中引入,Cloesable已在jdk1.5中。

根据https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

  

try-with-resources语句确保关闭每个资源   在声明的最后。任何实现的对象   java.lang.AutoCloseable,,包括实现的所有对象   java.io.Closeable,可以用作资源。

因此,Closeable实例已被视为try-with-resources语句中的资源。这是肯定的,因为CloseableAutoCloseable延伸。

我的问题是为什么java专门介绍了AutoCloseable,为什么他们只能让{},try-with-resources支持Closeable,是否还有其他方法可以使用AutoCloseable,除了{{ 1}}?

2 个答案:

答案 0 :(得分:11)

Closeable仅限于抛出IOException,这可能不适合某些可关闭但非IO绑定的资源。

宣布

AutoCloseable抛出Exception,使其更具通用性。

Closeable的API无法更改为抛出Exception,因为这将是一个重大变化,因此是新的超接口。

此外,正如documented

  

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

因此,虽然每个Closeable都是Autocloseable,但反之则不然,并且限制try-catch-finally限制为Closeable的语义。

答案 1 :(得分:0)

两者之间的区别在于,实现Closeable的类必须保证多次调用close()没有副作用。 AutoCloseable没有这样的限制。

在实践中,这意味着一切都应该是Closeable,但那些需要改装的类可以选择限制较少的AutoCloseable

相关问题