L'interfaccia Closeable
è stata introdotta in Java 5 mentre l'interfaccia AutoCloseable
è stata introdotta in Java 7 insieme all'istruzione try-with-resources
. Closeable
estende (da Java 7) l'interfaccia Autocloseable
.Come è garantita in Java l'idempotenza del metodo close() dell'interfaccia Closeable?
Nel libro OCA/OCP Java SE 7 - Programmer I & II Study Guide si dice a pagina 399:
cosa accade se chiamiamo il
close()
tempo multipla? Dipende. Per le classi che implementanoAutoCloseable
, l'implementazione deve essere idempotente. Il che significa che puoi chiamare loclose()
tutto il giorno e che nulla accadrà la seconda volta e oltre. [...] Per le classi che implementanoCloseable
, non esiste tale garanzia.
Quindi, secondo questo testo, le implementazioni di AutoCloseable
devono essere idempotente, e quelli di non Closeable
. Ora, quando ho uno sguardo alla documentazione della AutoCloseable
interface at docs.oracle.com, si dice:
Si noti che a differenza del metodo di
Closeable
close
, questo metodo vicino non è necessario essere idempotente. In altre parole, chiamare questo metodoclose
più volte potrebbe avere qualche effetto collaterale visibile, diversamente daCloseable.close
che non richiede alcun effetto se viene chiamato più di una volta.
Ora questo è l'opposto di ciò che è scritto nel libro. Ho due domande:
(1) Che cosa è corretto? Il documento su docs.oracle.com o il libro? Quale delle due interfacce richiede idempotence?
(2) Non importa quale debba essere idempotente - ho ragione che Java non ha in realtà alcun modo di garantire che sia idempotente? In tal caso, il "requisito" del metodo close
per essere idempotente è qualcosa che il programmatore dovrebbe fare, ma non posso mai essere sicuro che qualcuno che ha utilizzato l'interfaccia lo abbia effettivamente fatto, giusto? In questo caso l'idempotenza è semplicemente un suggerimento di oracolo, giusto?
2) Cosa intendi con: "Java non ha in realtà alcun modo per garantire che sia idempotente". Il linguaggio, come ad esempio il fatto di avere il metodo di indicazione del flag booleano finale, viene chiamato. D'altra parte, il compilatore non esegue alcun tipo di convalida della stretta implementazione per verificare che l'implementazione sia idempotente. – John
Informazioni su (1): Il libro in realtà ha un errore qui, ho appena trovato l'errata in questa pagina in cui è menzionata: http://www.coderanch.com/t/641206/ocajp/certification/Errata-OCA-OCP- Java-SE –
@John: Non capisco cosa intendi con la bandiera booleana. Sto solo parlando della proprietà dell'idempotence qui. La mia ipotesi è che una convalida della proprietà di idempotence non viene eseguita e anche questo non sarebbe possibile farlo. –