Als ich versuchte, ein Äquivalent eines Java try
-Codes mit Ressourcen in Kotlin zu schreiben , funktionierte es bei mir nicht.
Ich habe verschiedene Variationen der folgenden ausprobiert:
try (writer = OutputStreamWriter(r.getOutputStream())) {
// ...
}
Aber beides funktioniert nicht.
Weiß jemand, was stattdessen verwendet werden soll? Anscheinend hat die Kotlin-Grammatik keine Definition für ein solches Konstrukt, aber vielleicht fehlt mir etwas. Es definiert die Grammatik für den Try-Block wie folgt:
try : "try" block catchBlock* finallyBlock?;
OutputStreamWriter
:r.outputStream.writer.use { ... }
use
Erweiterung demonstriert : kotlinlang.org/docs/reference/…FileOutputStream(into).use { val mergingStream = BufferedOutputStream(it).use { } }
TL; DR: Keine spezielle Syntax, nur eine Funktion
Kotlin hat dafür im Gegensatz zu Java keine spezielle Syntax. Stattdessen wird Try-with-Resources als Standardbibliotheksfunktion angeboten
use
.Die
use
ImplementierungenDiese Funktion ist als generische Erweiterung für alle
Closeable?
Typen definiert.Closeable
ist Javas Schnittstelle , die das Testen mit Ressourcen ab Java SE7 ermöglicht .Die Funktion nimmt eine Funktionsliteral ,
block
die in einem ausgeführt wirdtry
. Das gleiche wie mit Try-mit-Ressourcen in Java, derCloseable
wird geschlossen in einemfinally
.Auch Fehler im Inneren
block
führen zuclose
Ausführungen, bei denen mögliche Ausnahmen buchstäblich "unterdrückt" werden, indem sie einfach ignoriert werden. Dies unterscheidet sich von Try-with-Resources , da solche Ausnahmen in der Java -Lösung angefordert werden können.Wie man es benutzt
Die
use
Erweiterung ist für jedenCloseable
Typ verfügbar , dh für Streams, Reader usw.Der Teil in geschweiften Klammern ist , was wird
block
inuse
(a Lambda wird hier als Argument übergeben). Nachdem der Block fertig ist, können Sie sicher sein, dassFileInputStream
er geschlossen wurde.quelle
Bearbeiten : Die folgende Antwort gilt weiterhin für Kotlin 1.0.x. Für Kotlin 1.1 wird eine Standardbibliothek unterstützt, die auf Java 8 abzielt, um geschlossene Ressourcenmuster zu unterstützen.
Für andere Klassen, die die "use" -Funktion nicht unterstützen, habe ich die folgenden hausgemachten Versuche mit Ressourcen durchgeführt:
Dann können Sie es folgendermaßen verwenden:
quelle
try/finally
BlockDa sich dieser StackOverflow-Beitrag ganz oben in den aktuellen Suchergebnissen für "Kotlin Closeable Example" befindet und dennoch keine der anderen Antworten (noch die offiziellen Dokumente) klar erklärt, wie
Closeable
(akajava.io.Closeable
) erweitert werden soll, dachte ich, ich würde ein Beispiel hinzufügen wie man eine eigene Klasse macht, die sich erweitertCloseable
. Es geht so:Und dann, um es zu benutzen:
Sehen Sie dieses Beispiel auf dem Kotlin-Spielplatz hier .
quelle