Menu
Coddy logo textTech

Patrón Try With Resources

Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy. Lección 62 de 87.

Al trabajar con recursos como flujos de archivos o conexiones de base de datos, siempre debes cerrarlos al terminar. De lo contrario, te arriesgas a sufrir fugas de memoria. El enfoque tradicional utiliza un bloque finally, pero es verboso y propenso a errores.

La instrucción try-with-resources de Java cierra automáticamente los recursos cuando se completa el bloque. Cualquier clase que implemente la interfaz AutoCloseable puede usarse con esta sintaxis:

// Enfoque tradicional - verboso y arriesgado
BufferedReader reader = null;
try {
    reader = new BufferedReader(new FileReader("file.txt"));
    String line = reader.readLine();
} finally {
    if (reader != null) {
        reader.close();  // ¡También podría lanzar una excepción!
    }
}

// Try-with-resources - limpio y seguro
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
    String line = reader.readLine();
}  // Se cierra automáticamente aquí

Puedes gestionar varios recursos separándolos con punto y coma. Se cierran en el orden inverso al de su declaración:

try (FileReader fr = new FileReader("input.txt");
     BufferedReader br = new BufferedReader(fr)) {
    // Usa ambos recursos
}  // br se cierra primero, luego fr

Para crear tu propia clase auto-cerrable, implementa la interfaz AutoCloseable y su único método close():

public class DatabaseConnection implements AutoCloseable {
    public DatabaseConnection() {
        System.out.println("Connection opened");
    }
    
    @Override
    public void close() {
        System.out.println("Connection closed");
    }
}

Este patrón garantiza que los recursos se liberen siempre correctamente, incluso si se producen excepciones durante el procesamiento.

challenge icon

Desafío

Fácil

¡Construyamos un sistema de gestión de recursos que demuestre el poder de try-with-resources! Crearás clases autocerrables personalizadas que simulan la gestión de conexiones y sesiones, asegurándote de que siempre se limpien correctamente.

Organizarás tu código en tres archivos:

  • Connection.java: Crea una clase que simule una conexión a una base de datos. Tu clase Connection debe implementar AutoCloseable. Necesita un campo privado para el nombre de la conexión (String), un constructor que reciba el nombre e imprima [name] connection opened, un método query(String sql) que imprima Executing on [name]: [sql] y el método requerido close() que imprima [name] connection closed.
  • Session.java: Crea otra clase autocerrable que simule una sesión de usuario. Tu clase Session también debe implementar AutoCloseable. Incluye un campo privado para el nombre de usuario (String), un constructor que reciba el nombre de usuario e imprima Session started for [username], un método performAction(String action) que imprima [username] performed: [action] y un método close() que imprima Session ended for [username].
  • Main.java: ¡Reúne tu sistema de gestión de recursos! Recibirás tres entradas: un nombre de conexión, un nombre de usuario y una acción que realizarás.

    Primero, demuestra la gestión de un solo recurso. Imprime === Single Resource ===; después, usa try-with-resources para crear una Connection con el nombre proporcionado. Dentro del bloque try, llama a query("SELECT * FROM users"). La conexión debería cerrarse automáticamente cuando termine el bloque.

    A continuación, demuestra el uso de varios recursos. Imprime una línea en blanco y después === Multiple Resources ===. Usa try-with-resources con una Connection (usando el mismo nombre) y una Session (usando el nombre de usuario), declaradas en ese orden y separadas por punto y coma. Dentro del bloque try, llama primero a query("INSERT INTO logs") en la conexión y después llama a performAction con la acción de entrada en la sesión. ¡Observa cómo los recursos se cierran en orden inverso!

Recibirás tres entradas en orden: nombre de conexión (String), nombre de usuario (String) y acción (String).

Observa cómo try-with-resources elimina la necesidad de realizar llamadas explícitas a close y de usar bloques finally. Se garantiza que los recursos se cierren incluso si se producen excepciones, y varios recursos se cierran en orden inverso al de su declaración.

Pruébalo tú mismo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String connectionName = scanner.nextLine();
        String username = scanner.nextLine();
        String action = scanner.nextLine();
        
        // === Single Resource ===
        // TODO: Imprime el encabezado
        // TODO: Usa try-with-resources para crear un Connection
        // TODO: Inside the try block, call query("SELECT * FROM users")
        
        // === Multiple Resources ===
        // TODO: Imprime una línea en blanco y el encabezado
        // TODO: Usa try-with-resources con Connection y Session
        // TODO: Dentro del bloque try:
        //       - Call query("INSERT INTO logs") on the connection
        //       - Llama a performAction con la action de entrada en el session
        
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Java online