【发布时间】:2013-10-11 14:01:52
【问题描述】:
java.lang.AutoCloseable 的 close() 方法的 Java 文档说
注意,与Closeable 的
close()方法不同,这个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