25

Closeable接口是在 Java 5 中引入的,而该接口与语句AutoCloseable一起出现在 Java 7中。扩展(从 Java 7 开始)接口。try-with-resourcesCloseableAutocloseable

OCA/OCP Java SE 7 - Programmer I & II Study Guide一书中,它在第 399 页上说:

如果我们调用close()多次会发生什么?这取决于。对于实现AutoCloseable的类,要求实现是幂等的。这意味着您可以close()整天打电话,第二次及以后不会发生任何事情。[...] 对于实现 的类,Closeable没有这样的保证。

因此,根据本文,实现AutoCloseable需要是幂等的,而那些Closeable不是。现在,当我查看AutoCloseabledocs.oracle.com 上的界面文档时,它说:

请注意,与 的close方法不同Closeable,此关闭方法不需要是幂等的。换句话说,close多次调用此方法可能会产生一些可见的副作用,Closeable.close这与多次调用必须没有效果不同。

现在这与书中所写的相反。我有两个问题:

(1) 什么是正确的?docs.oracle.com 上的文档还是书?这两个接口中的哪一个需要幂等性?

(2)无论哪一个需要幂等 - 我是对的,Java实际上根本没有办法确保它是幂等的吗?如果是这样,close幂等方法的“要求”是程序员应该做的事情,但我永远不能确定使用该接口的人确实做到了,对吧?在这种情况下,幂等性只是预言机的一个建议,对吗?

4

1 回答 1

20
  1. Oracle 的 Javadoc 是正确的。只是一个直觉,为什么 -AutoCloseable对象用于try(){}(所谓的资源尝试)块中,close()实际上是自动调用的,并且只调用一次;同时close()Closeable接口方法你总是手动调用,你可以不小心调用它两次或使你的代码易于阅读。另外 -Closeable扩展AutoCloseable,它不应该使close()方法的契约变得AutoCloseable更弱,它只能添加需求。AutoCloseable因此,当需要幂等并且扩展接口取消此要求时的抽象情况close()将只是一个糟糕的设计。

  2. 是的,你的理解是对的。这只是程序员应该考虑的合同。equals()就像和之间的合同一样hashCode()。您可以以不一致的方式实现它,编译器或其他任何东西都不会为您标记它。该问题只会在运行时出现。

于 2015-09-06T16:57:08.913 回答