A partir de la versión 7, Java ofrece una gestión mejorada de los recursos que deben cerrarse al terminar de trabajar con ellos. Dichos recursos incluyen, por ejemplo, archivos, flujos, conexiones de bases de datos y sockets. Este propósito lo cumple una construcción de lenguaje especial de prueba con recursos. Para que funcione este cierre automático se ha creado una interfaz especial
En Java 7, todas las clases de recursos implementan esta interfaz. Su firma se ve así:
AutoCloseable
. public interface AutoCloseable {
void close() throws Exception;
}
La interfaz declara un método close()
que se llama automáticamente en los objetos servidos por la construcción try-with-resources
. Aunque las clases de recursos en Java 7 implementan esta interfaz, muchas de las bibliotecas que utiliza no lo hacen, ya sea porque la biblioteca aún no se ha actualizado para funcionar con la interfaz AutoCloseable o simplemente no tiene la capacidad de actualizar la biblioteca. En la mayoría de los casos esto se puede resolver fácilmente. Hereda la clase de recurso que debería participar en try-with-resources
. Tomemos por ejemplo ITextRenderer
(del proyecto Flying Saucer). Después de terminar de trabajar con ITextRenderer
, se debe llamar al método finishPDF()
. Normalmente harías esto en un bloque finally
. Pero cuando crea una nueva clase que extiende ITextRenderer
e implementa la interfaz AutoCloseable
, puede incluirla en el archivo try-with-resources
. La nueva clase AutoCloseableITextRenderer
se verá así:
public class AutoCloseableITextRenderer extends ITextRenderer implements AutoCloseable {
@Override
public void close() {
super.finishPDF();
}
}
Extender la clase original en un descendiente es la solución más razonable, ya que la nueva clase seguirá siendo ITextRenderer
. En caso de que la clase original se declare como final
, se debe utilizar la composición. Y así es como se vería el uso:
try (final AutoCloseableITextRenderer iTextRenderer = new AutoCloseableITextRenderer()) {
ByteArrayOutputStream out; // contains the data to be converted to PDF, not shown here.
iTextRenderer.setDocumentFromString(new String(out.toByteArray()));
iTextRenderer.layout();
iTextRenderer.createPDF(pdfOutputStream);
pdfOutputStream.flush();
}
Eso es todo. Tenga en cuenta que no lancé una excepción de un método close()
en el archivo AutoCloseableITextRenderer
. El Javadoc de la interfaz AutoCloseable
dice lo siguiente sobre esto: Aunque el método de la interfaz está declarado para lanzar excepciones Exception
, se recomienda encarecidamente a los implementadores de este método que utilicen clases de excepción más específicas al implementar el método, o no lanzar excepciones en absoluto si el método close()
no puede. fallar.
GO TO FULL VERSION