Что означает идемпотентный метод и каковы побочные эффекты при вызове метода close java.lang.AutoCloseable?
Документы Java о методе close() java.lang.AutoCloseable говорит
Обратите внимание, что в отличие от метода close()
метода Closeable, этот метод close()
не обязательно должен быть идемпотентным. Другими словами, вызов этого метода close более одного раза может иметь некоторый видимый побочный эффект, в отличие от Closeable#close()
который не должен иметь эффекта при вызове более одного раза. Однако разработчикам этого интерфейса настоятельно рекомендуется сделать их близкие методы идемпотентными.
Что они подразумевают под идемпотентным методом и каковы побочные эффекты от вызова этого метода close()
дважды?
А поскольку интерфейс Closeable
расширяет AutoCloseable
почему побочные эффекты не видны при закрытии интерфейса Closeable
?
Ответы
Ответ 1
Idempotent означает, что вы можете применять операцию несколько раз, но результирующее состояние одного вызова будет неотличимым от результирующего состояния нескольких вызовов. Короче говоря, безопасно вызывать метод несколько раз. Фактически, второй и третий (и так далее) вызовы не будут иметь видимого влияния на состояние программы.
Итак, если вы закрываете этот объект один раз, и он закрывается, у вас недостаточно информации, чтобы знать, является ли он идемпотентным. Однако, если вы закрываете его дважды, и в первый раз он закрывается, но во второй раз он выдает исключение, он явно не является идемпотентным. С другой стороны, если вы закроете его один раз и закройте его дважды, а второе закрытие приведет к тому, что элемент остается закрытым тем же способом (возможно, это noop), то он идемпотент.
Одним из способов создания идемпотента Closeable
может быть:
public class Example implements Closeable {
private boolean closed;
public Example() {
closed = false;
}
public void close() {
if (!isClosed()) {
closed = true;
}
}
public boolean isClosed() {
return closed;
}
}
Теперь, когда теперь очевидно, что если close()
вызывается один или несколько раз, все возвращения состояния через isClosed()
будут навсегда возвращать true. Поэтому метод close()
будет считаться идемпотентным.
Ответ 2
Объяснение концепции без кода
![Einsteins definition of indempotency]()
Если принять афоризм Эйнштейна, если вы делаете то же самое и получаете разные результаты, то метод не идемпотентен.
Пример идемпотентности
"Please sir, can I have a pay rise?"
"No"
Один и тот же результат каждый раз. Требование повышения зарплаты - идемпотентная операция.
Примеры с HTTP-запросами:
- Создание запроса
get
: если он правильно реализован, то независимо от того, сколько раз вы выполняете этот запрос, вы получите один и тот же ответ.
- Например, операция, которая не является Idempotent, будет делать запрос
post
для создания ресурса - каждый раз, когда вы делаете это, вы будете изменять состояние приложения, в которое вы отправляете это сообщение: каждый ресурс будет создаваться каждый раз. время!
Ответ на ваш вопрос:
... не должно быть никаких побочных эффектов закрытия дважды, если это идемпотентный метод.....
Ответ 3
JAVA GLOSSARY
Идемпотентный
Если методы написаны таким образом, что повторные вызовы одного и того же метода не вызывают дублирования обновлений, этот метод называется " idempotent."
В математике идемпотентный элемент или идемпотент для краткости - это все, что при умножении на себя дает результат. Например, только два действительных числа, которые являются идемпотентными, равны 0 и 1.
В дизайне пользовательского интерфейса кнопку можно назвать "идемпотент", если нажатие на нее более одного раза будет иметь тот же эффект, что и однократное нажатие. Например, кнопка "Пауза" не является идемпотентной, если она переключает приостановленное состояние. С другой стороны, при многократном нажатии кнопки система приостанавливается, и нажатие "Воспроизведение" возобновляется, а "Пауза" - идемпотент. Это полезно в таких интерфейсах, как инфракрасные пульты дистанционного управления и сенсорные экраны, где пользователь может не быть уверенным, что нажал кнопку успешно и может нажать ее еще раз. Кнопки вызова с лифтом также идемпотентны, хотя многие люди думают, что это не так.
Ресурс: - http://www.allapplabs.com/glossary/idempotent.htm