JavaRush /Java-Blog /Random-DE /Java 7-Ausprobieren mit Ressourcen
DarthVictor
Level 28

Java 7-Ausprobieren mit Ressourcen

Veröffentlicht in der Gruppe Random-DE
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. Java 7-Ausprobieren mit Ressourcen – 1In 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 ITextRenderersollte die Methode aufgerufen werden finishPDF(). Normalerweise würden Sie dies in einem Block tun finally. Wenn Sie jedoch eine neue Klasse erstellen, die ITextRendererdie Schnittstelle erweitert und implementiert AutoCloseable, können Sie sie in die einbinden try-with-resources. Die neue Klasse AutoCloseableITextRendererwird 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 AutoCloseableheiß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.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION