AutoCloseable是在jdk1.7中引入的,Cloesable已经在jdk1.5中引入了。
根据https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html的说法
try-语句确保在语句末尾关闭每个资源。任何实现java.lang.AutoCloseable的对象,包括实现java.io.Closeable的所有对象的,都可以用作资源。
因此,Closeable实例已经可以在try-with-resources语句中作为资源处理。这是肯定的,因为Closeable是从AutoCloseable扩展的。
我的问题是为什么java专门引入了AutoCloseable,为什么它们不使try-with-resources中的支持更加接近,除了try-with-resources,AutoCloseable还有其他方法可以使用吗?
发布于 2014-11-11 13:48:52
Closeable仅限于抛出IOException,这可能不适用于某些可关闭但不受IO限制的资源。
AutoCloseable被声明为抛出Exception,这使得它更加通用。
Closeable的API不能更改为抛出Exception,因为这将是一个突破性的更改,因此出现了新的超级接口。
另外,作为documented
注意,与
close的Closeable方法不同,这个关闭方法不需要是幂等的。换句话说,多次调用这个关闭方法可能会产生一些明显的副作用,与Closeable.close不同的是,如果调用不止一次,则不需要有任何效果。但是,强烈鼓励该接口的实现者使其密切的方法成为幂等的。
因此,虽然每个Closeable都是Autocloseable,但相反的情况并不是真的,而且它将限制尝试捕获--最终限制在Closeable的语义上。
发布于 2014-11-11 13:48:29
两者的区别在于实现Closeable的类必须保证多次调用close()没有副作用。对AutoCloseable没有这样的限制。
实际上,这意味着一切都应该是Closeable,但是那些需要修改的类可以选择限制较小的AutoCloseable。
https://stackoverflow.com/questions/26866326
复制相似问题