首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中,如何确保关闭接口的close()方法的幂等性?

在Java中,如何确保关闭接口的close()方法的幂等性?
EN

Stack Overflow用户
提问于 2015-09-06 16:51:26
回答 1查看 2.2K关注 0票数 25

Closeable接口是在Java5中引入的,而AutoCloseable接口则是在Java7和try-with-resources语句中引入的。Closeable扩展了Autocloseable接口(从Java7开始)。

在“OCA/OCA 7-程序员I& II学习指南”()一书中,它在第399页上写道:

如果我们多次调用close()会发生什么?那得看情况。对于实现AutoCloseable的类,实现必须是幂等的。这意味着您可以整天打电话给close(),第二次和以后都不会发生任何事情。..。对于实现Closeable的类,没有这样的保证。

因此,根据本文,AutoCloseable的实现需要是幂等的,而Closeable的实现不是幂等的。现在,当我查看 interface at docs.oracle.com的文档时,它说:

注意,与closeCloseable方法不同,这个关闭方法不需要是幂等的。换句话说,多次调用此close方法可能会产生一些明显的副作用,与Closeable.close不同,后者在多次调用时不需要产生任何效果。

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

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

(2)无论哪一个人需要是幂等的--我说得对吗? Java实际上根本没有办法确保它是幂等的吗?如果是这样的话,close方法的“要求”就是程序员应该做的事情,但是我永远不能确定使用接口的人确实做了,对吧?在这种情况下,幂等仅仅是神谕的暗示,对吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-06 16:57:08

  1. Oracle的Javadoc是正确的。这只是直觉为什么- AutoCloseable对象被使用在try(){}块中(所谓的“用资源进行尝试”)块,其中close()实际上被自动调用一次;同时,从Closeable接口方法中的close()总是手动调用,您可以不小心调用它两次,或者使代码易于阅读。此外,Closeable扩展了AutoCloseable,它不应该使close()方法的契约从AutoCloseable变得更弱,它只能增加需求。因此,当AutoCloseable要求close()是幂等的并且扩展接口取消了这一需求时,抽象的情况将是一个糟糕的设计。
  2. 是的,你的理解是对的。这只是一个程序员应该考虑的契约。比如equals()hashCode()之间的合同。您可以以不一致的方式实现它,编译器或其他任何东西都不会为您标记它。这个问题只有在运行时才会出现。
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32425976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档