Cuando intenté escribir un equivalente de un try
có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?;
OutputStreamWriter
también:r.outputStream.writer.use { ... }
use
extensió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
use
implementacionesEsta 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 atry
. Al igual que con probar con recursos en Java, elCloseable
se cierra en afinally
.También las fallas que ocurren dentro
block
conducen aclose
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 cualquierCloseable
tipo, es decir, transmisiones, lectores, etc.La parte entre llaves es lo que se convierte
block
enuse
(aquí se pasa una lambda como argumento). Una vez que el bloqueo está hecho, puede estar seguro de queFileInputStream
se 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/finally
bloqueoDado 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