36

java.lang.AutoCloseable 的 close() 方法的 Java 文档说

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


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

既然接口Closeable扩展AutoCloseable了,为什么在接口关闭时看不到副作用Closeable

4

4 回答 4

42

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

所以如果你关闭这个对象一次,然后它就关闭了,你就没有足够的信息来知道它是否是幂等的。但是,如果你关闭它两次,第一次关闭,但第二次抛出异常,它显然不是幂等的。另一方面,如果你关闭它一次,然后关闭它两次,并且第二次关闭导致项目以相同的方式保持关闭(也许它是一个 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()将被认为是幂等的。

于 2013-10-11T14:06:15.863 回答
19

无代码概念解释

爱因斯坦对幂等性的定义

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

幂等性示例

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

"No"

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

HTTP 请求示例:

  • 提出get请求:如果实施得当,那么无论您提出多少次此请求,您都会得到相同的响应。例如,我get请求查看我的银行余额,结果是一样的。每次。与游戏垄断不同的是,我的银行余额中从来没有神奇地多出过 100 美元。
  • 例如,一个非幂等的操作会发出delete销毁资源的请求——每次你这样做时,你都会改变应用程序的状态。例如,美国国税局不断向我的银行账户发出删除请求 - 每次他们这样做时,我的银行账户的“状态”都会耗尽并减半。这是一个幂等操作。
于 2017-01-05T03:01:52.317 回答
5

JAVA 术语表 幂等

如果方法的编写方式使得对同一方法的重复调用不会导致重复更新,则该方法被称为“幂等”。

在数学中,幂等元素,或简称幂等,是指任何与自身相乘时将自身作为结果的元素。例如,唯一具有幂等性的两个实数是 0 和 1。

在用户界面设计中,一个按钮可以被称为“幂等的”,如果多次按下它会产生与按下一次相同的效果。例如,如果“暂停”按钮切换暂停状态,则它不是幂等的。另一方面,如果多次按下它会使系统暂停并继续按下“播放”,则“暂停”是幂等的。这在用户可能不确定是否成功按下按钮并可能再次按下的界面(如红外遥控器和触摸屏)中很有用。电梯呼叫按钮也是幂等的,尽管很多人认为不是。

资源:- http://www.allapplabs.com/glossary/idempotent.htm

于 2017-02-22T06:26:54.723 回答
0

幂等方法

如果每次调用的结果都相同,则HTTP 方法是幂等方法。当您调用任何请求n 次时,结果将是相同的。

举个例子,在任何数字中添加零都是相同的结果。

HTTP方法分为两种。

  1. 安全可重复(幂等
  2. 不能安全地重复(非幂等

安全可重复(幂等:任何时候调用方法,它都会给出相同的结果。它称为幂等方法。

GET、PUT、DELETE HTTP 方法称为幂等方法。因为

GET 方法:检索资源。 PUT 方法:它将更新一个资源。 DELETE 方法:用于删除单个资源,不影响其他资源。

不能安全地重复(非幂等

但是当 POST 方法调用时。 POST 方法每次都会创建新资源。因此它被称为非幂等

于 2021-07-04T16:16:39.513 回答