Интерфейс 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, он говорит:
Обратите внимание, что в отличие от метода
close
Closeable
этот закрытый метод не должен быть идемпотентным. Другими словами, вызов этого методаclose
более одного раза может иметь некоторый видимый побочный эффект, в отличие отCloseable.close
, который не должен иметь эффекта, если вызывается более одного раза.
Теперь это противоположность тому, что написано в книге. У меня есть два вопроса:
(1) Что правильно? Док на docs.oracle.com или в книге? Какой из двух интерфейсов требует идемпотенции?
(2) Независимо от того, какой из них должен быть идемпотентным, я прав, что Java фактически не имеет никакого способа гарантировать, что он идемпотент? Если это так, "требование" метода close
быть идемпотентным является тем, что программист должен, но я никогда не могу быть уверен, что тот, кто использовал интерфейс, действительно сделал это, правильно? В этом случае идемпотентность - это просто предложение оракула, правильно?