幂等方法是什么意思,如果调用java.lang.AutoCloseable的close方法,有什么副作用?无代码概念解释

2022-09-01 05:10:35

Java docs of close() method of java.lang.AutoCloseable 说

请注意,与 Closeableclose() 方法不同,此方法不需要是幂等的。换句话说,多次调用此 close 方法可能会产生一些明显的副作用,这与多次调用时不需要任何效果不同。但是,强烈建议此接口的实现者使其 close 方法具有幂等性。close()Closeable#close()


方法是什么意思,调用此方法两次的副作用是什么?close()

既然接口扩展了,为什么在接口的结尾看不到副作用呢?CloseableAutoCloseableCloseable


答案 1

幂等意味着您可以多次应用该操作,但一个调用的结果状态将与多个调用的结果状态无法区分。简而言之,多次调用该方法是安全的。实际上,第二次和第三次(依此类推)调用不会对程序状态产生明显的影响。

因此,如果您关闭此对象一次,然后它关闭,则没有足够的信息来知道它是否幂等。但是,如果您关闭它两次,第一次关闭,但第二次它引发异常,它显然不是幂等的。另一方面,如果您关闭它一次,关闭它两次,并且第二次关闭导致该项目以相同的方式保持关闭状态(也许是一个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;
  }
}

现在很明显,如果调用一次或多次,则通过状态的所有返回将永远返回 true。因此,该方法将被视为幂等。close()isClosed()close()


答案 2

无代码概念解释

Einsteins definition of indempotency

借用爱因斯坦的格言,如果你做同样的事情,得到不同的结果,那么这个方法就不是幂等的。

幂等性示例

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

"No"

每次的结果都一样。要求加薪是一种幂等的操作。

非幂等操作的示例:

...将发出销毁资源的请求。例如,税务局不断向我的银行帐户发出删除请求 - 将其状态从:$ 100更改为$ 45。每次发生此操作时,我的银行帐户都会永久更改 - 它不会保持不变,并且不能无限期地重复,因此,它是非幂等操作。delete


推荐