![](/img/trans.png)
[英]Does close() method of the Closeable interface has exception in the signature
[英]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
接口的文檔時,它說:
請注意,與
Closeable
的close
方法Closeable
,此 close 方法不需要是冪等的。 換句話說,多次調用此close
方法可能會產生一些可見的副作用,這與Closeable.close
不同,后者要求多次調用沒有效果。
現在這與書中所寫的相反。 我有兩個問題:
(1) 什么是正確的? docs.oracle.com 上的文檔還是這本書? 兩個接口中哪個需要冪等性?
(2) 不管哪一個需要是冪等的——我對 Java 實際上根本沒有辦法確保它是冪等的嗎? 如果是這樣, close
方法的“要求”是冪等的,這是程序員應該做的事情,但我永遠無法確定使用該接口的人確實做到了,對嗎? 在這種情況下,冪等性只是 oracle 的一個建議,對嗎?
來自 Oracle 的 Javadoc 是正確的。 只是一個直覺為什么 - AutoCloseable
對象用於try(){}
(所謂的try with resources )塊,其中close()
實際上是自動調用的,並且只調用一次; 同時close()
來自Closeable
接口方法,您總是手動調用,您可能會意外調用它兩次或使您的代碼易於閱讀。 另外- Closeable
擴展AutoCloseable
,它不應該使合同close()
從法AutoCloseable
弱,它只能增加的需求。 因此,當AutoCloseable
要求close()
是冪等的並且擴展接口取消此要求時的抽象情況將只是一個糟糕的設計。
是的,你的理解是對的。 這只是一個程序員應該考慮的契約。 就像equals()
和hashCode()
之間的契約。 您可以以不一致的方式實現它,編譯器或其他任何東西都不會為您標記它。 問題只會在運行時出現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.