2015-09-06 10 views
13

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 implementano AutoCloseable, l'implementazione deve essere idempotente. Il che significa che puoi chiamare lo close() tutto il giorno e che nulla accadrà la seconda volta e oltre. [...] Per le classi che implementano Closeable, 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 Closeableclose, questo metodo vicino non è necessario essere idempotente. In altre parole, chiamare questo metodo close più volte potrebbe avere qualche effetto collaterale visibile, diversamente da Closeable.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?

+0

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

+2

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 –

+0

@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. –

risposta

9
  1. Javadoc da Oracle è corretto. Solo un intuito perché - gli oggetti AutoCloseable sono usati nei blocchi try(){}, dove close viene chiamato in automatico e solo una volta; allo stesso tempo close() dal metodo di interfaccia Closeable chiami sempre manualmente e puoi chiamarlo due volte accidentalmente o rendere il tuo codice facile da leggere. Inoltre,estende AutoCloseable e non può indebolire il contratto del metodo close() da AutoCloseable - può solo aggiungere requisiti. Quindi, situazione astratta quando AutoCloseable richiedeva l'identificazione di idupro- nio e l'interfaccia estesa annullata close() questo requisito sarebbe solo un cattivo progetto.

  2. Sì, la vostra comprensione è giusta. È solo un contratto che il programmatore dovrebbe prendere in considerazione. Come il contratto tra equals() e hashCode(). Puoi implementarlo in modo incoerente e nessuno te lo dirà. Molto probabilmente avrai problemi in fase di esecuzione.

+0

Mi piace il confronto con 'equals()' e 'hashCode()' - bella questa. –

+0

@MathiasBader buono a sapersi, grazie. –

Problemi correlati