为什么自动关闭是Closeable的基本接口(反之亦然)?

2022-09-01 12:42:52

据我所知,Closeable接口是从Java 1.5开始的,AutoCloseable是在Java 1.7中引入的。
我试图理解的是,为什么Closeable扩展了AutoCloseable,而不是相反?这样做是因为向后依赖(无法更改Closeable接口),即AutoCloseable需要具有比Closeable更广泛的异常?还是我的逻辑是错误的,应该这样?


答案 1

这样,所有自动实现的用户代码都可以实现,这允许他们自动从 try-with-resources 语法中受益。CloseableAutoCloseable


答案 2

@Sotirios Delimanolis的评论已经确定了这一点。

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

因此,他们引入了具有较少限制语义的界面...并作为 的子类型进行改造。AutoClosableclose()CloseableAutoCloseable

另一件事是声明为投掷而不是。这意味着API的限制性低于...并且鉴于它在资源试用中有效地用作回调API,这使得它更灵活/更广泛地适用。(该 API 可用于与 I/O 无关的资源,但仍可能在关闭时引发异常。另一方面,如果方法已注入子类型,Java类型将不允许他们进行此类更改。AutoCloseable.close()ExceptionIOExceptionAutoCloseableCloseableclose() throws Exception


替代方案是:

  • 将“尝试使用资源”限制为具有幂等关闭的资源...这限制了它的有用性,或者

  • 回顾性地改变...这可能会导致人们在将旧代码移植到Java 7时遇到困难。Closeable.close()

  • 追溯性地更改...这将破坏二进制兼容性。Closeable.close()