簡體   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