9

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,为什么不只支持Closeable,try-with-resources除了AutoCloseable还有其他使用方式try-with-resources吗?

4

2 回答 2

11

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

AutoCloseable被声明为 throw Exception,使其更通用。

不能将 APICloseable更改为 throw Exception,因为这将是一个重大更改,因此是新的超级接口。

此外,如文件所述

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

因此,虽然 eachCloseableAutocloseable,但反之则不成立,将 try-catch-finally 限制为 的语义会受到限制Closeable

于 2014-11-11T13:48:52.657 回答
0

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

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

于 2014-11-11T13:48:29.583 回答