The Closeable
interface was introduced in Java 5 whereas the AutoCloseable
interface came in Java 7 together with the try-with-resources
statement. Closeable
extends (since Java 7) the Autocloseable
interface.
In the book OCA/OCP Java SE 7 - Programmer I & II Study Guide it says on page 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.
So according to this text, implementations of AutoCloseable
need to be idempotent, and those of Closeable
not. Now when I have a look at the documentation of the AutoCloseable
interface at docs.oracle.com, it says:
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.
Now this is the opposite of what is written in the book. I have two questions:
(1) What is correct? The doc at docs.oracle.com or the book? Which of the two interfaces requires idempotence?
(2) No matter which one needs to be idempotent - am I right that Java has actually no way at all to ensure that it is idempotent? If so, the "requirement" of the close
method to be idempotent is something that the programmer should do, but I can never be sure that someone who used the interface actually did do it, right? In this case the idempotence is merely a suggestion of oracle, correct?
AutoCloseable
requiredclose()
to be idempotent andCloseable
, a subtype, did not. That would imply that there could beAutoCloseable
s without an idempotentclose()
, as long as they implementCloseable
at the same time… – Daveta