172 votes

implémente Closeable ou implémente AutoCloseable

Je suis en train d'apprendre Java et je n'arrive pas à trouver une bonne explication sur le site de la Commission européenne. implements Closeable y el implements AutoCloseable interfaces.

Lorsque j'ai mis en place un interface Closeable Dans mon IDE Eclipse, j'ai créé une méthode public void close() throws IOException .

Je peux fermer le flux en utilisant pw.close(); sans l'interface. Mais, je n'arrive pas à comprendre comment je peux implémenter l'interface close() en utilisant l'interface. Et, quel est le but de cette interface ?

J'aimerais également savoir : comment puis-je vérifier si IOstream était vraiment fermée ?

J'utilisais le code de base ci-dessous

import java.io.*;

public class IOtest implements AutoCloseable {

public static void main(String[] args) throws IOException  {

    File file = new File("C:\\test.txt");
    PrintWriter pw = new PrintWriter(file);

    System.out.println("file has been created");

    pw.println("file has been created");

}

@Override
public void close() throws IOException {

}

240voto

Tomasz Nurkiewicz Points 140462

AutoCloseable (introduite dans Java 7) permet d'utiliser la fonction essayer avec les ressources idiome :

public class MyResource implements AutoCloseable {

    public void close() throws Exception {
        System.out.println("Closing!");
    }

}

Maintenant vous pouvez dire :

try (MyResource res = new MyResource()) {
    // use resource here
}

et la JVM appellera close() automatiquement pour vous.

Closeable est une interface plus ancienne. Pour une raison quelconque Pour préserver la rétrocompatibilité, les concepteurs du langage ont décidé d'en créer un autre. Cela permet non seulement à tous les Closeable (comme les flux qui lancent IOException ) à utiliser dans try-with-resources, mais permet également de lancer des exceptions vérifiées plus générales à partir de close() .

En cas de doute, utilisez AutoCloseable les utilisateurs de votre classe vous en seront reconnaissants.

92voto

JB Nizet Points 250258

Closeable étend AutoCloseable et est spécifiquement dédié aux flux d'E/S : il lance IOException au lieu de Exception et est idempotent, alors que AutoCloseable ne fournit pas cette garantie.

Tout ceci est expliqué dans la javadoc des deux interfaces.

Mise en œuvre de AutoCloseable (o Closeable ) permet à une classe d'être utilisée comme une ressource de la classe essayer avec les ressources introduite en Java 7, qui permet de fermer automatiquement de telles ressources à la fin d'un bloc, sans avoir à ajouter une balise finally qui ferme explicitement la ressource.

Votre classe ne représente pas une ressource pouvant être fermée, et il n'y a absolument aucun intérêt à implémenter cette interface : une ressource de type IOTest ne peut pas être fermé. Il ne devrait même pas être possible de l'instancier, puisqu'il n'a pas de méthode d'instance. Rappelez-vous que l'implémentation d'une interface signifie qu'il existe une méthode d'instance. est un la relation entre la classe et l'interface. Cette relation n'existe pas ici.

47voto

user714965 Points 14264

Il me semble que vous n'êtes pas très familier avec les interfaces. Dans le code que vous avez posté, vous n'avez pas besoin d'implémenter les interfaces. AutoCloseable .

Il suffit de (ou devrait) mettre en œuvre Closeable ou AutoCloseable si vous êtes sur le point de mettre en œuvre votre propre PrintWriter qui traite les fichiers ou toute autre ressource qui doit être fermée.

Dans votre implémentation, il suffit d'appeler pw.close() . Vous devez faire cela dans un bloc final :

PrintWriter pw = null;
try {
   File file = new File("C:\\test.txt");
   pw = new PrintWriter(file);
} catch (IOException e) {
   System.out.println("bad things happen");
} finally {
   if (pw != null) {
      try {
         pw.close();
      } catch (IOException e) {
      }
   }
}

Le code ci-dessus est lié à Java 6. En Java 7, cela peut être fait de manière plus élégante (voir cette réponse ).

10voto

Lova Chittumuri Points 621

Voici le petit exemple

public class TryWithResource {

    public static void main(String[] args) {
        try (TestMe r = new TestMe()) {
            r.generalTest();
        } catch(Exception e) {
            System.out.println("From Exception Block");
        } finally {
            System.out.println("From Final Block");
        }
    }
}

public class TestMe implements AutoCloseable {

    @Override
    public void close() throws Exception {
        System.out.println(" From Close -  AutoCloseable  ");
    }

    public void generalTest() {
        System.out.println(" GeneralTest ");
    }
}

Voici le résultat :

GeneralTest 
From Close -  AutoCloseable  
From Final Block

9voto

Arvind Katte Points 565

Récemment, j'ai lu un livre intitulé Java SE 8 Programmer Guide ii Book.

J'ai trouvé quelque chose sur la différence entre AutoCloseable vs Closeable .

En AutoCloseable a été introduite dans Java 7. Avant cela, une autre interface existait, appelée Closeable . Il était similaire à ce que les concepteurs du langage voulaient, avec les exceptions suivantes :

  • Closeable restreint le type d'exception déclenchée à IOException .
  • Closeable exige que les implémentations soient idempotentes.

Les concepteurs du langage mettent l'accent sur la rétrocompatibilité. Puisque la modification de l'interface n'était pas souhaitable, ils en ont créé une nouvelle appelée AutoCloseable . Cette nouvelle est moins stricte que l'interface Closeable . Puisque Closeable répond aux exigences de AutoCloseable elle a commencé à mettre en œuvre AutoCloseable lorsque ce dernier a été introduit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X