Closeable接口是在Java5中引入的,而AutoCloseable接口则是在Java7和try-with-resources语句中引入的。Closeable扩展了Autocloseable接口(从Java7开始)。
在“OCA/OCA 7-程序员I& II学习指南”()一书中,它在第399页上写道:
如果我们多次调用
close()会发生什么?那得看情况。对于实现AutoCloseable的类,实现必须是幂等的。这意味着您可以整天打电话给close(),第二次和以后都不会发生任何事情。..。对于实现Closeable的类,没有这样的保证。
因此,根据本文,AutoCloseable的实现需要是幂等的,而Closeable的实现不是幂等的。现在,当我查看 interface at docs.oracle.com的文档时,它说:
注意,与
close的Closeable方法不同,这个关闭方法不需要是幂等的。换句话说,多次调用此close方法可能会产生一些明显的副作用,与Closeable.close不同,后者在多次调用时不需要产生任何效果。
这与书中所写的完全相反。我有两个问题:
(1)什么是正确的?docs.oracle.com的医生还是那本书?这两个接口中的哪一个需要幂等性?
(2)无论哪一个人需要是幂等的--我说得对吗? Java实际上根本没有办法确保它是幂等的吗?如果是这样的话,close方法的“要求”就是程序员应该做的事情,但是我永远不能确定使用接口的人确实做了,对吧?在这种情况下,幂等仅仅是神谕的暗示,对吗?
发布于 2015-09-06 16:57:08
AutoCloseable对象被使用在try(){}块中(所谓的“用资源进行尝试”)块,其中close()实际上被自动调用一次;同时,从Closeable接口方法中的close()总是手动调用,您可以不小心调用它两次,或者使代码易于阅读。此外,Closeable扩展了AutoCloseable,它不应该使close()方法的契约从AutoCloseable变得更弱,它只能增加需求。因此,当AutoCloseable要求close()是幂等的并且扩展接口取消了这一需求时,抽象的情况将是一个糟糕的设计。equals()和hashCode()之间的合同。您可以以不一致的方式实现它,编译器或其他任何东西都不会为您标记它。这个问题只有在运行时才会出现。https://stackoverflow.com/questions/32425976
复制相似问题