幂等方法的含义是什么,以及在调用java.lang.AutoCloseable的close方法时有什么副作用?

时间:2013-10-11 14:01:53

标签: java idempotent autocloseable

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

 * <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接口关闭时不会出现副作用?

4 个答案:

答案 0 :(得分:31)

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

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

答案 1 :(得分:5)

没有任何代码的概念的简单解释

Einsteins definition of indempotency

  

&#39;精神错乱的定义是反复做同样的事情并期待不同的结果。&#39; - 阿尔伯特爱因斯坦

采用爱因斯坦的格言,这是幂等性的基本要点:一遍又一遍地做同样的事情并得到相同的结果。如果得到不同的结果,那么该方法不是幂等的。

通过日常类比的幂等性的例子

尝试1

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

"No!"

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

示例HTTP请求:

  • 发出get请求:如果执行得当,无论您提出此请求多少次,都会得到相同的回复。
  • 例如,非幂等的操作将发出post请求来创建资源 - 每次执行此操作时,您将更改要将其发布到的应用程序的状态:新资源将每次创建!

回答你的问题:

......如果它是一种幂等方法,那么关闭两次不应该有任何副作用......

就这么简单!希望这有助于某人 - 如果不发表评论,我会尝试清除它。

答案 2 :(得分:1)

JAVA术语表 幂等

如果以这样的方式编写方法,即重复调用同一方法不会导致重复更新,则该方法称为“幂等。”

在数学中,一个幂等元素,或一个幂等元素,就是当它自身相乘时,将其自身作为结果的任何东西。例如,幂等的唯一两个实数是0和1。

在用户界面设计中,如果按下按钮一次以上,则按钮可以被称为“幂等”按钮具有与按下按钮一样的效果。例如,如果“暂停”按钮切换暂停状态,则“暂停”按钮不是幂等的。另一方面,如果多次按下它会使系统暂停并按“播放”继续,则“暂停”是幂等的。这在诸如红外遥控器和触摸屏之类的接口中是有用的,其中用户可能不确定已成功按下按钮并且可能再次按下它。电梯呼叫按钮也是幂等的,尽管许多人认为它们不是。

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

答案 3 :(得分:0)

幂等方法

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

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

HTTP 方法分为两种。

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

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

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

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

不能安全地重复(非幂等

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