Archivo de la etiqueta: try-wity-resources

try-with-resources en Kotlin

EDITADO (7/4/2017): según comentan en StackOverflow, Kotlin 1.1 soporta try-with-resources en su librería estándar para Java 8

Una de las grandes novedades que nos trajo Java 7 fue el soporte para try-with-resources, que nos permitía definir bloques que, utilizando un recurso que implementara la interfaz “AutoCloseable“, cerraban éste implícitamente sin tener que preocuparnos de llamar a su método “close()“. Por ejemplo:

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
   return br.readLine();
}

Kotlin provee una solución equivalente para los objetos del tipo “Closeable“, que es la función “use“:

BufferedReader(FileReader("dsf")).use {
    it.readLine()
}

Sin embargo, parece que los creadores de Kotlin se han olvidado de las clases AutoCloseable, tales como los PreparedStatement de JDBC. Para solucionarlo, he creado una función trywr, fácilmente integrable en cualquier código

package info.macias.kotlin
inline fun <T:AutoCloseable,R> trywr(closeable: T, block: (T) -> R): R {
    try {
        return block(closeable);
    } finally {
        closeable.close()
    }
}

Un ejemplo de uso sencillo:

import info.macias.kotlin.trywr
fun countEvents(): Long {
    return trywr(connection.prepareStatement("SELECT COUNT(*) FROM event")) {
        var rs = it.executeQuery()
        rs.next()
        rs.getLong(1)
    }
}

No obstante, me comentan en Stackoverflow que aunque la solución es sencilla y hará su función, no reproducirá exactamente el comportamiento estándar de Java.