Подтвердить что ты не робот

Что означает идемпотентный метод и каковы побочные эффекты при вызове метода close java.lang.AutoCloseable?

Документы Java о методе close() java.lang.AutoCloseable говорит

Обратите внимание, что в отличие от метода close() метода Closeable, этот метод close() не обязательно должен быть идемпотентным. Другими словами, вызов этого метода close более одного раза может иметь некоторый видимый побочный эффект, в отличие от Closeable#close() который не должен иметь эффекта при вызове более одного раза. Однако разработчикам этого интерфейса настоятельно рекомендуется сделать их близкие методы идемпотентными.


Что они подразумевают под идемпотентным методом и каковы побочные эффекты от вызова этого метода close() дважды?

А поскольку интерфейс Closeable расширяет AutoCloseable почему побочные эффекты не видны при закрытии интерфейса Closeable?

4b9b3361

Ответ 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