繁体   English   中英

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

[英]Why is AutoCloseable the base interface for Closeable (and not vice versa)?

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

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

@Sotirios Delimanolis 的评论已经说明了这一点。

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

因此,他们引入了AutoClosable接口,其具有较少限制的close()语义......并改装Closeable作为AutoCloseable的子类型。

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


替代方案是:

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

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

  • 追溯更改Closeable.close()的签名......这会破坏二进制兼容性。

Closeable接口是在 Java 5 中引入的。 当try-with-resources (下面是示例代码)在 Java 7 中引入时,语言设计者想要改变一些东西但需要向后兼容(所有代码都是在以前的版本中编写的不应该随着新功能的引入而过时),因此他们创建了一个带有他们想要的规则的 Superinterface AutoCloseable

尝试使用资源的示例:

    try (NewResource a = NewResource.CreateResource();
{
    }

上面的代码是尝试使用资源。 我们可以简单地理解为,在这段代码中,我们可以在 try 代码中声明一个新变量本身,并且该变量可以调用代码中的其他方法。 除了减少try块的冗长之外,这段代码也不需要 finally 块,但执行环境应该是 Java 7 或更高版本。 虽然finally是JVM自己创建的。

closeableAutocloseable接口只包含一个方法

void close()

close ()的方法closeable抛出IOExceptionAutocloseableclose()方法将抛出Exception

Closeable有一些限制,因为它只能抛出IOException ,因此在不破坏遗留代码的情况下无法更改它。 所以引入了AutoCloseable ,它可以抛出Exception

AutoCloseable用于使用 >JDK7 的应用程序。

由于 JDK7+ 库使用AutoCloseable并且实现Closeable遗留代码仍然需要与 JDK7+ 兼容,因此 Closeable 扩展了 AutoCloseable。

public interface Closeable extends AutoCloseable {
    public void close() throws IOException;
}

AutoCloseable专门设计用于与 try-with-resources 语句一起使用。 由于Closeable扩展了AutoCloseable ,try-with-resources 可用于关闭任何实现 Closeable 或 AutoCloseable 的资源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM