【问题标题】:What does idempotent method mean and what are the side effects in case of calling close method of java.lang.AutoCloseable?幂等方法是什么意思,调用java.lang.AutoCloseable的close方法有什么副作用?
【发布时间】:2013-10-11 14:01:52
【问题描述】:

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

注意,与Closeableclose() 方法不同,这个close() 方法是 不需要是幂等的。换句话说,称之为 close 方法不止一次可能有一些明显的副作用,不像 Closeable#close() 如果调用更多,则必须无效 不止一次。然而,这个接口的实现者强烈 鼓励使他们的 close 方法具有幂等性。


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

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

【问题讨论】:

  • 编程上下文中的幂等意味着您可以安全地重复操作。例如,您可以多次发出相同的 HTTP GET 请求而不必担心副作用(假设它已在服务器上正确实现)。
  • 这意味着您可以重复该操作'n'次并获得相同的结果,在Http幂等方法中示例是GET
  • @RamonBoza 是的,假设服务器没有更改返回的资源,并且 web 客户端不计算请求,并且不跟踪最后请求时间等等。更好的例子是public int add(int first, int second) { return first + second; } 两个后续调用肯定不会改变程序的状态,因为程序甚至不会改变它的状态。另一个示例void close() { if (!closed) { file.close(); closed = true; } },因为它确实在第一次调用时改变了状态,但在后续调用中状态保持不变。
  • @EdwinBuck 这是一个合理的假设,因为根据 HTTP 规范,HTTP GET 请求(以及其他请求)应该是幂等的。
  • @JohnTopley 幂等性非常依赖于参考框架。从服务器内部状态的角度来看,GET 意味着是幂等的。当然,客户的观点不同,否则我们永远不会重新访问相同的网站以获取每日更新。服务器摆脱更改数据的唯一方法是服务器将请求的内容委托给有状态的东西(即文件系统或底层应用程序)。

标签: java idempotent autocloseable


【解决方案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;
  }
}

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

【讨论】:

  • 另请注意,这只是one interpretation of the term "idempotent"。 “幂等”在不同的上下文中还有其他含义。
  • @Pacerier 这也是您更正的第一句话的几乎逐字兼容的描述。如果你使用数学理论方法来分析计算,它仍然是这个定义,尽管有轻微的改写f(f(x)) = f(x),如果你说数学意味着“如果你对x执行两次操作f,它与执行相同对x 进行一次f 操作。
【解决方案2】:

无代码概念解释

adopt Einstein's aphorism,如果你做同样的事情,得到不同的结果,那么这个方法就不是幂等的。

幂等性示例

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

"No"

Same result every time。要求加薪是幂等操作。

HTTP 请求示例:

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

【讨论】:

  • 很好的例子:)
【解决方案3】:

JAVA 词汇表 幂等

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

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

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

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

【讨论】:

    【解决方案4】:

    幂等方法

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

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

    HTTP方法分为两种。

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

    安全可重复(幂等:随时调用方法,结果相同。它称为幂等方法。

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

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

    不能安全地重复(非幂等

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 2013-01-30
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多