【问题标题】:Why Java7 introduces AutoCloseable specially? [closed]为什么 Java7 专门引入了 AutoCloseable? [关闭]
【发布时间】:2015-01-08 02:04:30
【问题描述】:

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 语句中的资源。这是肯定的,因为Closeable 扩展自AutoCloseable

我的问题是java为什么专门引入AutoCloseable,为什么不只在try-with-resources支持Closeable,除了try-with-resources还有其他的AutoCloseable使用方式吗?

【问题讨论】:

    标签: java autocloseable


    【解决方案1】:

    Closeable 被限制为 throw IOException,这可能不适合一些可关闭但非 IO 绑定的资源。

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

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

    另外,作为documented

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

    因此,虽然每个 Closeable 都是 Autocloseable,但反过来不成立,将 try-catch-finally 限制为 Closeable 的语义会受到限制。

    【讨论】:

    • 非常感谢!!我觉得第一个理由更有说服力。如果您能更新您的答案并给我们一个close() 不会抛出IOException 的资源示例,那就太好了。
    • @Jaskey: ResultSet 就是一个很好的例子,close() 抛出 SqlException
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多