当前位置: 首页 > 知识库问答 >
问题:

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

曾新
2023-03-14

closeable接口是在Java5中引入的,而autocloseable接口与try-with-resources语句一起出现在Java7中。closeable扩展了autocloseable接口(从Java7开始)。

在《OCA/OCP Java SE7-Programmer I&II学习指南》一书中,第399页说:

如果我们多次调用close()会发生什么?看情况.对于实现autocloseable的类,要求实现是幂等的。这意味着您可以整天调用close(),第二次或以后都不会发生任何事情。[...]对于实现closeable的类,则没有这样的保证。

因此本文认为,autocloseable的实现必须是幂等的,而closeable的实现则不是幂等的。现在,当我在docs.oracle.com上查看autocloseable界面的文档时,它说:

注意,与closeableclose方法不同,这个close方法不要求是幂等的。换句话说,多次调用此Close方法可能会产生一些明显的副作用,这与CloseBle.Close不同,如果多次调用CloseBle.Close则需要无效。

这和书上写的正好相反。我有两个问题:

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

共有1个答案

桓喜
2023-03-14

>

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

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

  •  类似资料:
    • 本文向大家介绍Python Selenium 之关闭窗口close与quit的方法,包括了Python Selenium 之关闭窗口close与quit的方法的使用技巧和注意事项,需要的朋友参考一下 selenium关闭窗口有两个方法,close与quit,我们稍作研究便知道这两个方法的区别。 1.看源码或API 这是close()的说明: 这是quit()的说明: 从这里就很明显的看出来这两个方

    • 问题内容: 据我了解,如果您使用Java实现接口,则实现该接口的子类必须使用该接口中指定的方法。 我注意到在某些接口(例如Collection接口)中,有一些方法被注释为可选方法,但这究竟意味着什么?我觉得接口中指定的所有方法都需要吗? 问题答案: 这里的答案似乎有很多混乱。 Java语言要求接口中的每种方法都必须由该接口的每种实现来实现。期。 这条规定没有例外。 说“收藏是一个例外”,这表明对这

    • 我注意到在一些接口中,比如Collection接口,有一些方法被注释为可选的,但这到底是什么意思呢?它让我有点困惑,因为我认为接口中指定的所有方法都是必需的?

    • 我有一个简单的AMQP / RabbitMQ异步消费者,使用Pika库用Python编写,并基于Pika文档中的异步消费者示例。主要区别在于我想在线程中运行我的线程,我希望它正确关闭连接,然后在一定时间间隔后退出(即终止线程)。以下是我打开连接并设置超时的方法。我还打开一个频道,创建一个交易所并绑定一个队列......一切正常。 下面是超时回调: 这是_stop方法: 下面是启动线程的run方法:

    • 最近我正在学习Java8个特性,所以我从lambda表达式开始,然后我遇到了Java流API,现在我正在尝试围绕流API中的方法,它们是如何工作的? 我对lambda表达式的理解是,如果我们想将lambda表达式传递给该方法,那么我们需要使用单个未实现的方法(Java 8接口可以有默认实现)创建一个与lambda表达式的签名匹配的接口。然后,传递lambda表达式的方法可以通过调用接口方法来执行l