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
语句中的资源。这是肯定的,因为Closeable
从AutoCloseable
延伸。
我的问题是为什么java专门介绍了AutoCloseable
,为什么他们只能让{},try-with-resources
支持Closeable,是否还有其他方法可以使用AutoCloseable,除了{{ 1}}?
答案 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
。