Cuando intenté escribir un equivalente de un trycódigo Java con recursos en Kotlin, no funcionó para mí.
Intenté diferentes variaciones de lo siguiente:
try (writer = OutputStreamWriter(r.getOutputStream())) {
// ...
}
Pero tampoco funciona.
¿Alguien sabe qué se debe usar en su lugar? Aparentemente, la gramática de Kotlin no tiene definición para tal construcción, pero tal vez me falta algo. Define la gramática para el bloque try de la siguiente manera:
try : "try" block catchBlock* finallyBlock?;

OutputStreamWritertambién:r.outputStream.writer.use { ... }useextensión: kotlinlang.org/docs/reference/…FileOutputStream(into).use { val mergingStream = BufferedOutputStream(it).use { } }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.Las
useimplementacionesEsta 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 atry. Al igual que con probar con recursos en Java, elCloseablese cierra en afinally.También las fallas que ocurren dentro
blockconducen acloseejecuciones, 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 cualquierCloseabletipo, es decir, transmisiones, lectores, etc.La parte entre llaves es lo que se convierte
blockenuse(aquí se pasa una lambda como argumento). Una vez que el bloqueo está hecho, puede estar seguro de queFileInputStreamse ha cerrado.fuente
Editar : la siguiente respuesta sigue siendo válida para Kotlin 1.0.x. Para Kotlin 1.1, existe una biblioteca estándar compatible con Java 8 para admitir un patrón de recursos que se puede cerrar.
Para otras clases que no admiten la función "usar", he realizado los siguientes recursos caseros de prueba con recursos:
Luego puede usarlo de la siguiente manera:
fuente
try/finallybloqueoDado que esta publicación de StackOverflow está cerca de la parte superior de los resultados de búsqueda actuales para "ejemplo que se puede cerrar de Kotlin", y sin embargo ninguna de las otras respuestas (ni los documentos oficiales) explican claramente cómo extender
Closeable(también conocidojava.io.Closeable), pensé que agregaría un ejemplo de cómo hacer tu propia clase que se extiendaCloseable. Dice así:Y luego para usarlo:
Vea este ejemplo en el Kotlin Playground aquí .
fuente