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

Java docs метода close () java.ленг.AutoCloseable говорит

 * <p>Note that unlike the {@link java.io.Closeable#close close}
 * method of {@link java.io.Closeable}, this {@code close} method
 * is <em>not</em> required to be idempotent.  In other words,
 * calling this {@code close} method more than once may have some
 * visible side effect, unlike {@code Closeable.close} which is
 * required to have no effect if called more than once.

что они подразумевают под идемпотентным методом и каковы побочные эффекты вызова этого метода close() дважды? И так как интерфейс Closeable расширяет AutoCloseable, почему побочные эффекты не видны в конце Closeable интерфейса?

3 ответов


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() будет считаться тождественной.


я объясню основную концепцию:

что идемпотентности?

Einsteins definition of indempotency

пример идемпотентности

Попытка 1

"Please sir, can I have a pay rise?"

"No!"

тот же результат каждый раз.

чтобы ответить на ваш вопрос..

...не должно быть никаких побочных эффектов закрытия дважды, если это идемпотентный метод.....И все очень просто! Надеюсь, это кому-то поможет.


ГЛОССАРИЙ JAVA Идемпотент

Если методы написаны таким образом, что повторные вызовы одного и того же метода не вызывают повторяющихся обновлений, метод называется "идемпотентных."

в математике идемпотентным элементом, или идемпотентом для краткости, является все, что, умноженное на себя, дает себя как результат. Например, единственными двумя вещественными числами, которые являются идемпотентными, являются 0 и 1.

в дизайне пользовательского интерфейса, кнопку можно назвать "идемпотентной", если нажатие на нее более одного раза будет иметь тот же эффект, что и нажатие один раз. Например, кнопка "пауза" не является идемпотентной, если она переключает состояние паузы. С другой стороны, если нажатие несколько раз удерживает систему на паузе и нажатие "Play" возобновляется, то "Pause" является идемпотентным. Это полезно в интерфейсах как ультракрасные дистанционные управления и экраны касания где потребитель не может быть уверен отжимать кнопку успешно и может отжать его снова. Кнопки вызова лифта также идемпотентны, хотя многие люди думают, что это не так.

ресурс: -http://www.allapplabs.com/glossary/idempotent.htm