Java - Essayez avec des ressources

1. Vue d’ensemble

La prise en charge de try-with-resources (introduite dans Java 7) nous permet de déclarer les ressources à utiliser dans un bloc try avec l’assurance que les ressources seront fermées après l’exécution de ce bloc. Les ressources déclarées doivent implémenter l’interface AutoCloseable .

2. Utiliser try-with-resources

En termes simples, pour être fermée automatiquement, une ressource doit être déclarée et initialisée à l’intérieur du try , comme indiqué ci-dessous:

try (PrintWriter writer = new PrintWriter(new File("test.txt"))) {
    writer.println("Hello World");
}

3. Remplacement de try catch-finally par try-with-resources

Le moyen simple et évident d’utiliser la nouvelle fonctionnalité try-with-resources consiste à remplacer le bloc traditionnel et détaillé try-catch-finally .

Comparons les exemples de code suivants - il s’agit en premier lieu d’un bloc try-catch-finally , puis de la nouvelle approche utilisant un bloc try-with-resources équivalent:

Scanner scanner = null;
try {
    scanner = new Scanner(new File("test.txt"));
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    if (scanner != null) {
        scanner.close();
    }
}

Et voici la solution très succincte utilisant des ressources d’essai:

try (Scanner scanner = new Scanner(new File("test.txt"))) {
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException fnfe) {
    fnfe.printStackTrace();
}

4. try-with-resources avec plusieurs ressources

Plusieurs ressources peuvent être déclarées sans problème dans un bloc try-with-resources en les séparant par un point-virgule:

try (Scanner scanner = new Scanner(new File("testRead.txt"));
    PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {
    while (scanner.hasNext()) {
    writer.print(scanner.nextLine());
    }
}

5. Une ressource personnalisée avec __ AutoCloseable

__

Pour construire une ressource personnalisée qui sera correctement traitée par un bloc try-with-resources , la classe doit implémenter les interfaces Closeable ou AutoCloseable et remplacer la méthode close :

public class MyResource implements AutoCloseable {
    @Override
    public void close() throws Exception {
        System.out.println("Closed MyResource");
    }
}

6. Ordre de clôture des ressources

Les ressources définies/acquises en premier seront fermées en dernier; Voyons un exemple de ce comportement:

Ressource 1:

public class AutoCloseableResourcesFirst implements AutoCloseable {

    public AutoCloseableResourcesFirst() {
        System.out.println("Constructor -> AutoCloseableResources__First");
    }

    public void doSomething() {
        System.out.println("Something -> AutoCloseableResources__First");
    }

    @Override
    public void close() throws Exception {
        System.out.println("Closed AutoCloseableResources__First");
    }
}

Ressource 2:

public class AutoCloseableResourcesSecond implements AutoCloseable {

    public AutoCloseableResourcesSecond() {
        System.out.println("Constructor -> AutoCloseableResources__Second");
    }

    public void doSomething() {
        System.out.println("Something -> AutoCloseableResources__Second");
    }

    @Override
    public void close() throws Exception {
        System.out.println("Closed AutoCloseableResources__Second");
    }
}

Code:

private void orderOfClosingResources() throws Exception {
    try (AutoCloseableResourcesFirst af = new AutoCloseableResourcesFirst();
        AutoCloseableResourcesSecond as = new AutoCloseableResourcesSecond()) {

        af.doSomething();
        as.doSomething();
    }
}

Sortie:

Constructor → AutoCloseableResources First + Constructor → AutoCloseableResources Second + Quelque chose → AutoCloseableResources First + Quelque chose → AutoCloseableResources Second + Quelque chose → AutoCloseableResources First + Quelque chose → AutoCloseableResources Second + Fermeture AutoClosableResources Second Second Calcul

** 7. capture

Un bloc try-with-resources peut toujours avoir les blocs catch et finally - qui fonctionneront de la même manière qu’avec un bloc try traditionnel.

8. Conclusion

Dans cet article, nous avons expliqué comment utiliser try-with-resources, comment remplacer try , catch et finally par try-with-resources, en créant des ressources personnalisées avec AutoCloseable et en indiquant l’ordre de fermeture des ressources.

Le code source complet de l’exemple est disponible à l’adresse this GitHub .