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
界面的文档时,它说:
注意,与closeable
的close
方法不同,这个close方法不要求是幂等的。换句话说,多次调用此Close
方法可能会产生一些明显的副作用,这与CloseBle.Close
不同,如果多次调用此CloseBle.Close
则需要无效。
这和书上写的正好相反。我有两个问题:
(1)什么是正确的?docs.oracle.com上的文档还是那本书?两个接口中哪一个需要幂等性?
>
来自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