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 use
implementaciones
@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. Closeable
es la interfaz de Java que permite probar con recursos a partir de Java SE7 .
La función toma una función literal block
que se ejecuta en a try
. Al igual que con probar con recursos en Java, el Closeable
se cierra en a finally
.
También las fallas que ocurren dentro block
conducen a close
ejecuciones, 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 use
extensión está disponible en cualquier Closeable
tipo, 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 block
en use
(aquí se pasa una lambda como argumento). Una vez que el bloqueo está hecho, puede estar seguro de que FileInputStream
se ha cerrado.