Closeable
接口(interface)是在 Java 5 中引入的,而 AutoCloseable
接口(interface)是在 Java 7 中与 try-with-resources
语句一起出现的。 Closeable
扩展了(从 Java 7 开始)Autocloseable
接口(interface)。
在OCA/OCP Java SE 7 - Programmer I & II Study Guide这本书的第 399 页上说:
What happends if we call the
close()
multiple time? It depends. For classes that implementAutoCloseable
, the implementation is required to be idempotent. Which means you can callclose()
all day and nothing will happen the second time and beyond. [...] For classes that implementCloseable
, there is no such guarantee.
所以根据本文,AutoCloseable
的实现需要是幂等的,而Closeable
的实现则不需要。现在,当我查看 AutoCloseable
interface at docs.oracle.com 的文档时,它说:
Note that unlike the
close
method ofCloseable
, this close method is not required to be idempotent. In other words, calling thisclose
method more than once may have some visible side effect, unlikeCloseable.close
which is required to have no effect if called more than once.
现在这与书中所写的相反。我有两个问题:
(1) 什么是正确的? docs.oracle.com 上的文档还是书?这两个接口(interface)中哪一个需要幂等性?
(2) 不管哪一个需要幂等——Java实际上根本没有办法确保它是幂等的,我说得对吗?如果是这样,close
方法的“要求”是幂等的,这是程序员 应该 做的事情,但我永远无法确定使用该接口(interface)的人确实做到了做对了?在这种情况下,幂等性只是预言机的一个建议,对吗?
最佳答案
来自 Oracle 的 Javadoc 是正确的。只是一个直觉 -
AutoCloseable
对象用于try(){}
(所谓的 try with resources) block ,其中close ()
实际上是自动调用的,而且只调用一次;同时Closeable
接口(interface)方法中的close()
您总是手动调用它,您可以不小心调用它两次或使您的代码易于阅读。 此外 -Closeable
扩展了AutoCloseable
并且它不应该使AutoCloseable
中的close()
方法的契约变弱,它只能添加需求。因此,当AutoCloseable
要求close()
是幂等的并且扩展接口(interface)取消此要求时的抽象情况将只是一个糟糕的设计。是的,你的理解是对的。这只是程序员应该考虑的契约(Contract)。就像
equals()
和hashCode()
之间的合约一样。您可以以不一致的方式实现它,编译器或其他任何东西都不会为您标记它。该问题只会在运行时出现。
关于java - Java中如何保证Closeable接口(interface)的close()方法的幂等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32425976/