Интерфейс Closeable был введен в Java 5, тогда как интерфейс AutoCloseable появился в Java 7 вместе с оператором try-with-resources. Closeable расширяет (начиная с Java 7) интерфейс AutoCloseable.
В книге OCA/OCP Java SE 7 - Учебное пособие для программистов я и II говорится на стр. 399:
Что происходит, если мы назовем
close()несколько раз? Это зависит. Для классов, реализующихAutoCloseable, реализация должна быть идемпотентной. Это означает, что вы можете называтьclose()весь день, и ничего не произойдет во второй раз и за его пределами. [...] Для классов, реализующихCloseable, такой гарантии нет.
Поэтому в соответствии с этим текстом реализации AutoCloseable должны быть идемпотентными, а те, что указаны в Closeable, нет. Теперь, когда я смотрю документацию AutoCloseable на docs.oracle.com, он говорит:
Обратите внимание, что в отличие от метода
closeCloseableэтот закрытый метод не должен быть идемпотентным. Другими словами, вызов этого методаcloseболее одного раза может иметь некоторый видимый побочный эффект, в отличие отCloseable.close, который не должен иметь эффекта, если вызывается более одного раза.
Теперь это противоположность тому, что написано в книге. У меня есть два вопроса:
(1) Что правильно? Док на docs.oracle.com или в книге? Какой из двух интерфейсов требует идемпотенции?
(2) Независимо от того, какой из них должен быть идемпотентным, я прав, что Java фактически не имеет никакого способа гарантировать, что он идемпотент? Если это так, "требование" метода close быть идемпотентным является тем, что программист должен, но я никогда не могу быть уверен, что тот, кто использовал интерфейс, действительно сделал это, правильно? В этом случае идемпотентность - это просто предложение оракула, правильно?