Estoy mirando ejemplos de try-con-recursos en Java y entiendo la siguiente:
try (Connection conn = DriverManager.getConnection(url, user, pwd);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query);) {
...
}
Por lo tanto, el orden de cierre es:
rs.close();
stmt.close();
conn.close();
lo cual es perfecto porque tiene una conexión de una declaración y una declaración tiene un conjunto de resultados.
Sin embargo, en los siguientes ejemplos, el orden de cerca creo que es lo contrario de lo esperado:
Ejemplo 1:
try (FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr)) {
...
}
El orden de cierre es:
br.close();
fr.close();
Ejemplo 2:
try (FileOutputStream fos = new FileOutputStream("testSer.ser");
ObjectOutputStream oos = new ObjectOutputStream(fs);) {
...
}
El orden de cierre es:
oos.close();
fos.close();
Son correctos estos ejemplos? Creo que el cierre de estos ejemplos debe ser diferente porque:
- En el ejemplo 1 un BufferedReader tiene una FileReader.
- En el ejemplo 2 un ObjectOutputStream tiene un FileOutputStream.
Creo que no estaba bien cuando me dijo "tiene una conexión de una declaración y una declaración tiene un conjunto de resultados". Tal vez sea todo lo contrario "un conjunto de resultados tiene una declaración y una declaración tiene una conexión" o al menos "un conjunto de resultados fue creado por una declaración y una declaración fue creado por una conexión".
Por eso pienso:
try (Parent parent = new Parent();
Child child = parent.createChild();) {
...
}
Es equivalente a:
try (Parent parent = new Parent();
Child child = new Child(parent);) {
...
}