Ab Version 7 bietet Java eine verbesserte Verwaltung von Ressourcen, die nach Abschluss der Arbeit geschlossen werden sollten. Zu diesen Ressourcen zählen beispielsweise Dateien, Streams, Datenbankverbindungen und Sockets. Diesem Zweck dient ein spezielles Sprachkonstrukt try-with-resources. Damit dieses automatische Schließen funktioniert, wurde eine spezielle Schnittstelle erstellt
AutoCloseable
. In Java 7 implementieren alle Ressourcenklassen diese Schnittstelle. Seine Signatur sieht so aus:
public interface AutoCloseable {
void close() throws Exception;
}
Die Schnittstelle deklariert eine Methode close()
, die automatisch für die vom Konstrukt bereitgestellten Objekte aufgerufen wird try-with-resources
. Obwohl die Ressourcenklassen in Java 7 diese Schnittstelle implementieren, ist dies bei vielen der von Ihnen verwendeten Bibliotheken nicht der Fall, entweder weil die Bibliothek noch nicht für die Verwendung mit der AutoCloseable- Schnittstelle aktualisiert wurde oder Sie einfach nicht die Möglichkeit haben, die Bibliothek zu aktualisieren. In den meisten Fällen kann dies leicht gelöst werden. Erben Sie die Ressourcenklasse, die an der teilnehmen soll try-with-resources
. Nehmen wir zum Beispiel ITextRenderer
(aus dem Flying Saucer-Projekt). Nach Abschluss der Arbeit mit ITextRenderer
sollte die Methode aufgerufen werden finishPDF()
. Normalerweise würden Sie dies in einem Block tun finally
. Wenn Sie jedoch eine neue Klasse erstellen, die ITextRenderer
die Schnittstelle erweitert und implementiert AutoCloseable
, können Sie sie in die einbinden try-with-resources
. Die neue Klasse AutoCloseableITextRenderer
wird so aussehen:
public class AutoCloseableITextRenderer extends ITextRenderer implements AutoCloseable {
@Override
public void close() {
super.finishPDF();
}
}
Die Erweiterung der ursprünglichen Klasse in einem Nachkommen ist die sinnvollste Lösung, da die neue Klasse weiterhin vorhanden sein wird ITextRenderer
. Falls die ursprüngliche Klasse als deklariert ist final
, muss die Zusammensetzung verwendet werden. Und so würde die Nutzung aussehen:
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();
}
Das ist alles. Bitte beachten Sie, dass ich keine Ausnahme von einer Methode close()
in der . ausgelöst habe AutoCloseableITextRenderer
. Im Javadoc der Schnittstelle AutoCloseable
heißt es dazu: Obwohl die Schnittstellenmethode zum Auslösen von Ausnahmen deklariert ist Exception
, wird den Implementierern dieser Methode dringend empfohlen, bei der Implementierung der Methode spezifischere Ausnahmeklassen zu verwenden oder überhaupt keine Ausnahmen auszulösen, wenn die Methode dies close()
nicht kann scheitern.
GO TO FULL VERSION