为什么AutoCloseable是Closeable的基本接口(反之亦然)?

mar*_*hin 25 java api interface

据我所知,Closeable接口来自Java 1.5,AutoCloseable是在Java 1.7中引入的.
我想要了解的是为什么Closeable 扩展 AutoCloseable而不是反过来?这是因为向后依赖(无法更改Closeable接口),即AutoCloseable需要比Closeable更广泛的异常吗?或者我的逻辑是错的,它应该是那样的?

Lou*_*man 30

这样,所有Closeable自动实现的用户代码都可以实现AutoCloseable,这使得它们可以自动从try-with-resources语法中受益.

  • 使用Closeable,您只能抛出IOException,而使用AutoCloseable接口,您可以抛出所有Exception (7认同)

Ste*_*n C 22

@Sotirios Delimanolis的评论已经确定了它.

Java 7团队想要一种机制来将对象标记为可以自动关闭"try with resources"构造.不幸的是,该Closeable.close()方法的API规范过于严格.它要求该close()方法是幂等的......但这在"尝试用资源"用例中是不必要的.

因此,他们引入了AutoClosable界限较少的close()语义...并且Closeable作为子类型进行了复古拟合AutoCloseable.

另一件事是AutoCloseable.close()被宣布为投掷Exception而不是IOException.这意味着AutoCloseableAPI比Closeable... 更少限制,并且考虑到它在try-with-resources中被有效地用作回调 API,这使得它更灵活/更广泛适用.(API可用于与I/O无关的资源,但仍可能在关闭时抛出异常.)另一方面,如果closes() throws Exception方法已被注入,Java类型将不允许它们进行此类更改进入子类型.


替代方案可能是:

  • 限制"尝试用资源"来限制幂等的资源......这限制了它的用处,或者

  • 回顾性地改变...的语义,Closeable.close()这可能导致人们将旧代码移植到Java 7的困难

  • 回顾性地改变Closeable.close()...... 的签名会破坏二进制兼容性.

  • 查看包结构:java.io.Closeable vs java.lang.AutoCloseable>我的问题是为什么Closable不正确.我认为它是为了向后兼容而完成的,但是Closeable类用于**IO**操作,而AutoCloseable用于**任何资源**.在他们自己的类名称不具有语义意义. (5认同)