TL; DR: sin sintaxis especial, solo una función
Kotlin, a diferencia de Java, no tiene una sintaxis especial para esto. En cambio, try-with-resources , se ofrece como la función de biblioteca estándar use.
FileInputStream("filename").use { fis -> //or implicit `it`
//use stream here
}
Las useimplementaciones
@InlineOnly
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {
var closed = false
try {
return block(this)
} catch (e: Exception) {
closed = true
try {
this?.close()
} catch (closeException: Exception) {
}
throw e
} finally {
if (!closed) {
this?.close()
}
}
}
Esta función se define como una extensión genérica en todos los Closeable?tipos. Closeablees la interfaz de Java que permite probar con recursos a partir de Java SE7 .
La función toma una función literal blockque se ejecuta en a try. Al igual que con probar con recursos en Java, el Closeablese cierra en a finally.
También las fallas que ocurren dentro blockconducen a closeejecuciones, donde las posibles excepciones son literalmente "suprimidas" simplemente ignorándolas. Esto es diferente de probar con recursos , porque tales excepciones se pueden solicitar en la solución de Java .
Cómo usarlo
La useextensión está disponible en cualquier Closeabletipo, es decir, transmisiones, lectores, etc.
FileInputStream("filename").use {
//use your stream by referring to `it` or explicitly give a name.
}
La parte entre llaves es lo que se convierte blocken use(aquí se pasa una lambda como argumento). Una vez que el bloqueo está hecho, puede estar seguro de que FileInputStreamse ha cerrado.