L'obiettivo chiave del try-with-resources in Java è il rilascio automatico e corretto delle risorse. Prima dell'introduzione di questa struttura in Java 7, i programmatori erano costretti a chiudere le risorse manualmente nel blocco finally. Ciò portava a duplicazioni di codice ed errori frequenti.
In Java 6 e versioni precedenti, le risorse (file aperti, flussi, connessioni) dovevano essere gestite manualmente tramite finally, il che spesso portava a perdite di risorse.
Il codice scritto manualmente per la chiusura delle risorse è fonte di bug, soprattutto quando si lavora con più eccezioni e una gerarchia complessa di blocchi catch. Non c'è garanzia che close() venga chiamato in caso di errori.
Con Java 7 è stata introdotta la sintassi try-with-resources, che garantisce la chiamata automatica del metodo close() per ogni risorsa che implementa l'interfaccia AutoCloseable.
Esempio di codice:
try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) { String line = reader.readLine(); System.out.println(line); } catch (IOException e) { e.printStackTrace(); } // reader viene chiuso automaticamente
Caratteristiche chiave:
AutoCloseable possono essere utilizzati nel try-with-resources.Domanda 1: Quale interfaccia deve implementare la risorsa per il try-with-resources?
AutoCloseable. Qualsiasi oggetto che implementa questa interfaccia (o Closeable) può essere utilizzato nella struttura.
Domanda 2: In che ordine vengono chiuse le risorse, se ce ne sono più di una nel try-with-resources?
Le risorse vengono chiuse in ordine inverso rispetto alla loro dichiarazione (stile LIFO):
try (A a = new A(); B b = new B()) { ... } // b.close() verrà chiamato per primo, poi a.close()
Domanda 3: È possibile utilizzare il try-with-resources per oggetti non standard, come una connessione di rete, per la quale non esiste un'implementazione di AutoCloseable?
No, ma è possibile implementare AutoCloseable manualmente nella propria classe. Dopo di che, l'oggetto diventerà compatibile con il try-with-resources.
Gli sviluppatori chiudevano manualmente la connessione JDBC e lo Statement tramite finally. Quando si verificava una seconda eccezione, la chiusura dello Statement non avveniva, la connessione "bloccava" e nascondeva l'errore.
Vantaggi:
Svantaggi:
Dopo l'implementazione del try-with-resources nel modulo di caricamento dei file, tutti i flussi vengono chiusi automaticamente, il codice è diventato molto più corto, sono scomparsi i bug delle perdite di descrittori di file.
Vantaggi:
Svantaggi: