Java >> Java tutorial >  >> Tag >> implements

implementerer Lukbar eller implementerer AutoCloseable

AutoCloseable (introduceret i Java 7) gør det muligt at bruge prøv-med-ressourcerne formsprog:

public class MyResource implements AutoCloseable {

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

}

Nu kan du sige:

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

og JVM kalder close() automatisk for dig.

Closeable er en ældre grænseflade. Af en eller anden grund For at bevare bagudkompatibilitet besluttede sprogdesignere at oprette en separat. Dette tillader ikke kun alle Closeable klasser (som streams, der kaster IOException ) skal bruges i prøv-med-ressourcer, men tillader også at smide mere generelle kontrollerede undtagelser fra close() .

Brug AutoCloseable, hvis du er i tvivl , vil brugere af din klasse være taknemmelige.


Closeable udvider AutoCloseable , og er specifikt dedikeret til IO-streams:det kaster IOException i stedet for Exception og er idempotent, hvorimod AutoCloseable ikke giver denne garanti.

Dette er alt sammen forklaret i javadoc for begge grænseflader.

Implementering af AutoCloseable (eller Closeable) gør det muligt for en klasse at blive brugt som en ressource af try-with-resources-konstruktionen introduceret i Java 7, som gør det muligt at lukke sådanne ressourcer automatisk i slutningen af ​​en blok, uden at skulle tilføje en endelig blok, der lukker ressourcen eksplicit.

Din klasse repræsenterer ikke en lukbar ressource, og der er absolut ingen mening i at implementere denne grænseflade:en IOTest kan ikke lukkes. Det burde ikke engang være muligt at instansiere det, da det ikke har nogen instansmetode. Husk, at implementering af en grænseflade betyder, at der er en is-a forholdet mellem klassen og grænsefladen. Du har ikke noget sådant forhold her.


Det forekommer mig, at du ikke er særlig fortrolig med grænseflader. I den kode, du har sendt, behøver du ikke implementere AutoCloseable .

Du skal (eller bør) kun implementere Closeable eller AutoCloseable hvis du er ved at implementere din egen PrintWriter , som håndterer filer eller andre ressourcer, som skal lukkes.

I din implementering er det nok at ringe til pw.close() . Du skal gøre dette i en endelig blok:

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) {
      }
   }
}

Ovenstående kode er Java 6 relateret. I Java 7 kan dette gøres mere elegant (se dette svar).


Java tag