implementiert Closeable oder implementiert AutoCloseable
Lesezeit: 7 Minuten
Malas
Ich bin dabei, Java zu lernen, und ich kann keine gute Erklärung dazu finden implements Closeable und die implements AutoCloseable Schnittstellen.
Als ich eine implementierte interface Closeablemeine Eclipse-IDE hat eine Methode erstellt public void close() throws IOException.
Ich kann den Stream mit schließen pw.close(); ohne Schnittstelle. Aber ich kann nicht verstehen, wie ich das umsetzen kannclose() Methode über die Schnittstelle. Und was ist der Zweck dieser Schnittstelle?
Außerdem würde ich gerne wissen: Wie kann ich überprüfen, ob IOstream war wirklich geschlossen?
Ich habe den folgenden Basiscode verwendet
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 {
}
Ich denke, alles wurde bereits gesagt, aber vielleicht interessiert Sie der folgende Artikel über Anprobe-Ressourcen: docs.oracle.com/javase/tutorial/essential/exceptions/… . Dies kann auch hilfreich sein, um die gegebenen Antworten zu verstehen.
public class MyResource implements AutoCloseable {
public void close() throws Exception {
System.out.println("Closing!");
}
}
Jetzt können Sie sagen:
try (MyResource res = new MyResource()) {
// use resource here
}
und JVM ruft an close() automatisch für Sie.
Closeable ist eine ältere Schnittstelle. Aus irgendeinem Grund Um die Abwärtskompatibilität zu wahren, haben sich die Sprachdesigner entschieden, eine separate zu erstellen. Dies ermöglicht nicht nur alle Closeable Klassen (wie Streams werfen IOException) in Try-with-Ressourcen verwendet werden, ermöglicht aber auch das Auslösen allgemeinerer geprüfter Ausnahmen von close().
Verwenden Sie im Zweifelsfall AutoCloseableBenutzer Ihrer Klasse werden es Ihnen danken.
Der Grund ist einfach: Closeable.close() wirft IOException. Viele close() Methoden, die von Try-with-Ressourcen profitieren könnten, lösen andere geprüfte Ausnahmen aus (z java.sql.Connection.close() Also AutoCloseable.close() wirft Exception. Vorhandenes verändern Closeable Vertrag würde alle bestehenden Anwendungen/Bibliotheken brechen, die sich auf den Vertrag verlassen close() nur wirft IOException und nicht alle (markierten) Ausnahmen.
– Mark Rotteveel
30. Oktober 2012 um 14:49 Uhr
@MarkRotteveel: +1, danke. Ich habe meine Antwort korrigiert, um Ihre Vorschläge und Kommentare widerzuspiegeln.
– Tomasz Nurkiewicz
30. Oktober 2012 um 14:57 Uhr
Und auch: Closeable.close() muss idempotent sein. AutoCloseable.close() ist es nicht, obwohl es immer noch dringend empfohlen wird.
– Lukas Eder
25. Januar 2014 um 17:00 Uhr
Verwenden Sie auch nicht die Standardeinstellung public void close( ) throws Exception — Verwenden Sie eine spezifischere Ausnahme, wenn Sie können (z. B. IOException)
– gerardw
15. November 2014 um 20:23 Uhr
Closeable nicht Garantie Idempotenz. Es erfordert Idempotenz in der Implementierung des Benutzers close() Methode. Und ob IOException spezifischer/angemessener ist, hängt vom Anwendungsfall ab.
– xdhmoore
15. Juli 2015 um 22:33 Uhr
JB Niet
Closeable erweitert AutoCloseableund ist speziell für IO-Streams bestimmt: es wirft IOException Anstatt von Exceptionund ist idempotent, wohingegen AutoCloseable bietet diese Garantie nicht.
Dies wird alles im Javadoc beider Interfaces erklärt.
Implementieren AutoCloseable (oder Closeable) ermöglicht die Verwendung einer Klasse als Ressource der Versuch-mit-Ressourcen Konstrukt, das in Java 7 eingeführt wurde und es ermöglicht, solche Ressourcen automatisch am Ende eines Blocks zu schließen, ohne dass eine hinzugefügt werden muss finally Block, der die Ressource explizit schließt.
Ihre Klasse stellt keine schließbare Ressource dar, und es macht absolut keinen Sinn, diese Schnittstelle zu implementieren: an IOTest kann nicht geschlossen werden. Es sollte nicht einmal möglich sein, es zu instanziieren, da es keine Instanzmethode hat. Denken Sie daran, dass die Implementierung einer Schnittstelle bedeutet, dass es eine gibt ist ein Beziehung zwischen der Klasse und der Schnittstelle. Sie haben hier keine solche Beziehung.
Einfach umsetzen Verschließbar für Streams-bezogene Klassen und AutoClosable für andere, die eine Autoclose-Funktion erfordern.
– lospejos
13. Juli 2016 um 15:13 Uhr
Kai
Mir scheint, dass Sie sich mit Schnittstellen nicht sehr gut auskennen. In dem von Ihnen geposteten Code müssen Sie nichts implementieren AutoCloseable.
Sie müssen (oder sollten) nur implementieren Closeable oder AutoCloseable wenn Sie dabei sind, Ihre eigene zu implementieren PrintWriterdas Dateien oder andere Ressourcen verarbeitet, die geschlossen werden müssen.
In Ihrer Implementierung reicht es aus, anzurufen pw.close(). Sie sollten dies in einem finally-Block tun:
Der obige Code bezieht sich auf Java 6. In Java 7 geht das eleganter (siehe diese Antwort).
Warum nur mit a PrintWriter? Besonders AutoClosable Objekte können in viel mehr Situationen als nur verwendet werden PrintWriters…
– glglgl
26. Januar 2015 um 14:53 Uhr
Du liegst absolut richtig. Die Frage war ca PrintWriter also habe ich es konkreter erwähnt.
– Kai
26. Januar 2015 um 19:48 Uhr
Warum beschreiben Sie die Situation für Java 6 im Kontext von AutoCloseable? Zeigen Sie besser a try-with-resources stattdessen …
– ᴠɪɴᴄᴇɴᴛ
1. Dezember 2017 um 14:09 Uhr
Lova Chittumuri
Hier das kleine Beispiel
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 ");
}
}
Hier ist die Ausgabe:
GeneralTest
From Close - AutoCloseable
From Final Block
Arvin Katte
Kürzlich habe ich ein Java SE 8 Programmer Guide ii Book gelesen.
Ich habe etwas über den Unterschied zwischen gefunden AutoCloseable vs Closeable.
Das AutoCloseable -Schnittstelle wurde in Java 7 eingeführt. Davor existierte eine andere Schnittstelle namens Closeable. Es ähnelte dem, was die Sprachdesigner wollten, mit den folgenden Ausnahmen:
Closeable schränkt den Typ der ausgelösten Ausnahme ein IOException.
Closeable erfordert, dass Implementierungen idempotent sind.
Die Sprachdesigner legen Wert auf Abwärtskompatibilität. Da eine Änderung der bestehenden Schnittstelle nicht wünschenswert war, wurde eine neue aufgerufen AutoCloseable. Diese neue Schnittstelle ist weniger streng als Closeable. Seit Closeable erfüllt die Anforderungen für AutoCloseablees begann mit der Umsetzung AutoCloseable als letzteres eingeführt wurde.
Anstatt zu sagen: „Diese neue Schnittstelle ist weniger streng als Closeable“, würde ich vorschlagen zu sagen: „Diese neue Schnittstelle kann in allgemeineren Kontexten verwendet werden, in denen die beim Schließen ausgelöste Ausnahme nicht unbedingt eine IOException ist.“ Im Java-Universum hat „weniger streng“ eine negative Stimmung.
– Urquell
8. September 2019 um 4:47 Uhr
ItamarG3
Das try-with-resources Aussage.
Das try-with-resources statement ist ein try -Anweisung, die eine oder mehrere Ressourcen deklariert. EIN resource ist ein Objekt, das geschlossen werden muss, nachdem das Programm damit fertig ist. Das try-with-resources statement stellt sicher, dass jede Ressource am Ende der Anweisung geschlossen wird. Jedes Objekt, das implementiert java.lang.AutoCloseabledie alle Objekte enthält, die implementieren java.io.Closeablekann als Ressource verwendet werden.
Das folgende Beispiel liest die erste Zeile aus einer Datei. Es verwendet eine Instanz von BufferedReader um Daten aus der Datei zu lesen. BufferedReader ist eine Ressource, die geschlossen werden muss, nachdem das Programm damit fertig ist:
In diesem Beispiel ist die in der try-with-resources-Anweisung deklarierte Ressource ein BufferedReader. Die Deklarationsanweisung steht in Klammern unmittelbar nach dem Schlüsselwort try. Die Klasse BufferedReaderin Java SE 7 und höher, implementiert die Schnittstelle java.lang.AutoCloseable. Weil die BufferedReader -Instanz in einer try-with-resource-Anweisung deklariert wird, wird sie geschlossen, unabhängig davon, ob die try-Anweisung normal oder abrupt abgeschlossen wird (als Ergebnis der Methode method BufferedReader.readLine werfen ein IOException).
Vor Java SE 7 können Sie a finally -Block, um sicherzustellen, dass eine Ressource geschlossen wird, unabhängig davon, ob die try-Anweisung normal oder abrupt abgeschlossen wird. Das folgende Beispiel verwendet a finally Block statt a try-with-resources Aussage:
Anstatt zu sagen: „Diese neue Schnittstelle ist weniger streng als Closeable“, würde ich vorschlagen zu sagen: „Diese neue Schnittstelle kann in allgemeineren Kontexten verwendet werden, in denen die beim Schließen ausgelöste Ausnahme nicht unbedingt eine IOException ist.“ Im Java-Universum hat „weniger streng“ eine negative Stimmung.
– Urquell
8. September 2019 um 4:47 Uhr
13451000cookie-checkimplementiert Closeable oder implementiert AutoCloseableyes
Ich denke, alles wurde bereits gesagt, aber vielleicht interessiert Sie der folgende Artikel über Anprobe-Ressourcen: docs.oracle.com/javase/tutorial/essential/exceptions/… . Dies kann auch hilfreich sein, um die gegebenen Antworten zu verstehen.
– Crusam
30. Oktober 2012 um 14:51 Uhr