La tarea clave de try-with-resources en Java es la liberación automática y correcta de recursos. Antes de la aparición de esta construcción en Java 7, los programadores tenían que cerrar los recursos manualmente en el bloque finally. Esto llevaba a la duplicación de código y a errores frecuentes.
En Java 6 y versiones anteriores, los recursos (archivos abiertos, flujos, conexiones) tenían que ser administrados manualmente a través de finally, lo que a menudo resultaba en fugas de memoria.
El código de cierre de recursos escrito manualmente es una fuente de errores, especialmente al trabajar con múltiples excepciones y una jerarquía de bloques catch compleja. No hay garantía de que se llame a close() en caso de errores.
Con Java 7, se introdujo la sintaxis try-with-resources, que garantiza la llamada automática al método close() para cada recurso que implementa la interfaz AutoCloseable.
Ejemplo de código:
try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) { String line = reader.readLine(); System.out.println(line); } catch (IOException e) { e.printStackTrace(); } // reader se cierra automáticamente
Características clave:
AutoCloseable pueden ser utilizados en try-with-resources.Pregunta 1: ¿Qué interfaz debe implementar un recurso para try-with-resources?
AutoCloseable. Cualquier objeto que implemente esta interfaz (o Closeable) puede ser utilizado en la construcción.
Pregunta 2: ¿En qué orden se cierran los recursos si hay varios en try-with-resources?
Los recursos se cierran en el orden inverso a su declaración (LIFO):
try (A a = new A(); B b = new B()) { ... } // b.close() se llamará primero, luego a.close()
Pregunta 3: ¿Se puede usar try-with-resources para objetos no estándar, por ejemplo, para una conexión de red que no tiene implementación de AutoCloseable?
No, pero se puede implementar AutoCloseable manualmente en tu clase. Después de eso, el objeto será compatible con try-with-resources.
Los desarrolladores cerraban manualmente la conexión JDBC y la declaración a través de finally. Al producirse una segunda excepción, el cierre de la declaración no se ejecutaba, la conexión "se colgó" y ocultó el error.
Ventajas:
Desventajas:
Después de implementar try-with-resources en el módulo de carga de archivos, todos los flujos se cierran automáticamente, el código se volvió mucho más corto, desaparecieron los errores de fuga de descriptores de archivos.
Ventajas:
Desventajas: