繁体   English   中英

Java中如何保证Closeable接口的close()方法的幂等性?

[英]How is in Java the idempotence of the close() method of the Closeable interface ensured?

Closeable接口是在 Java 5 中引入的,而AutoCloseable接口是在 Java 7 中与try-with-resources语句一起出现的。 Closeable扩展(自 Java 7 起) Autocloseable接口。

OCA/OCP Java SE 7 - Programmer I & II Study Guide一书中,它在第 399 页说:

如果我们多次调用close()发生什么? 这取决于。 对于实现AutoCloseable类,要求实现是幂等的。 这意味着您可以整天调用close()并且第二次及以后不会发生任何事情。 [...] 对于实现Closeable类,没有这样的保证。

所以根据本文, AutoCloseable实现需要是幂等的,而Closeable不需要。 现在,当我查看docs.oracle.com 上AutoCloseable接口的文档,它说:

请注意,与Closeableclose方法Closeable ,此 close 方法不需要是幂等的。 换句话说,多次调用此close方法可能会产生一些可见的副作用,这与Closeable.close不同,后者要求多次调用没有效果。

现在这与书中所写的相反。 我有两个问题:

(1) 什么是正确的? docs.oracle.com 上的文档还是这本书? 两个接口中哪个需要幂等性?

(2) 不管哪一个需要是幂等的——我对 Java 实际上根本没有办法确保它是幂等的吗? 如果是这样, close方法的“要求”是幂等的,这是程序员应该做的事情,但我永远无法确定使用该接口的人确实做到了,对吗? 在这种情况下,幂等性只是 oracle 的一个建议,对吗?

  1. 来自 Oracle 的 Javadoc 是正确的。 只是一个直觉为什么 - AutoCloseable对象用于try(){} (所谓的try with resources )块,其中close()实际上是自动调用的,并且只调用一次; 同时close()来自Closeable接口方法,您总是手动调用,您可能会意外调用它两次或使您的代码易于阅读。 另外- Closeable扩展AutoCloseable ,它不应该使合同close()从法AutoCloseable弱,它只能增加的需求。 因此,当AutoCloseable要求close()是幂等的并且扩展接口取消此要求时的抽象情况将只是一个糟糕的设计。

  2. 是的,你的理解是对的。 这只是一个程序员应该考虑的契约。 就像equals()hashCode()之间的契约。 您可以以不一致的方式实现它,编译器或其他任何东西都不会为您标记它。 问题只会在运行时出现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM