JavaRush /Blog Java /Random-FR /Essai Java 7 avec ressources
DarthVictor
Niveau 28

Essai Java 7 avec ressources

Publié dans le groupe Random-FR
Depuis la version 7, Java offre une gestion améliorée des ressources qui doivent être fermées une fois leur utilisation terminée. Ces ressources incluent, par exemple, des fichiers, des flux, des connexions à des bases de données et des sockets. Cet objectif est atteint par une construction de langage spéciale try-with-resources. Pour que cette fermeture automatique fonctionne, une interface spéciale a été créée AutoCloseable. Essai Java 7 avec ressources - 1Dans Java 7, toutes les classes de ressources implémentent cette interface. Sa signature ressemble à ceci :
public interface AutoCloseable {
    void close() throws Exception;
}
L'interface déclare une méthode close()qui est automatiquement appelée sur les objets servis par la construction try-with-resources. Bien que les classes de ressources de Java 7 implémentent cette interface, la plupart des bibliothèques que vous utilisez ne le font pas, soit parce qu'elles n'ont pas encore été mises à jour pour fonctionner avec l' interface AutoCloseable , soit parce que vous n'avez tout simplement pas la possibilité de mettre à jour la bibliothèque. Dans la plupart des cas, cela peut être facilement résolu. Héritez de la classe de ressources qui doit participer au try-with-resources. Prenons par exemple ITextRenderer(du projet Flying Saucer). Après avoir fini de travailler avec ITextRenderer, la méthode doit être appelée finishPDF(). Normalement, vous feriez cela en bloc finally. Mais lorsque vous créez une nouvelle classe qui étend ITextRendereret implémente l'interface AutoCloseable, vous pouvez l'inclure dans le fichier try-with-resources. La nouvelle classe AutoCloseableITextRendererressemblera à ceci :
public class AutoCloseableITextRenderer extends ITextRenderer implements AutoCloseable {
    @Override
    public void close() {
        super.finishPDF();
    }
}
Étendre la classe d'origine dans un descendant est la solution la plus raisonnable, puisque la nouvelle classe sera toujours ITextRenderer. Dans le cas où la classe d'origine est déclarée comme final, la composition doit être utilisée. Et voici à quoi ressemblerait l’utilisation :
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();
        }
C'est tout. Veuillez noter que je n'ai pas levé d'exception à une méthode close()dans le fichier AutoCloseableITextRenderer. Le Javadoc de l'interface AutoCloseabledit ce qui suit à ce sujet : Bien que la méthode d'interface soit déclarée pour lever des exceptions Exception, il est fortement recommandé aux implémenteurs de cette méthode d'utiliser des classes d'exceptions plus spécifiques lors de l'implémentation de la méthode, ou de ne pas lever d'exceptions du tout si la méthode close()ne peut pas le faire. échouer.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION