Kotlin zapewnia funkcję use
dla obiektów Closeable
, ale wygląda na to, że zapomniały rozważyć AutoCloseable
(np. Instrukcje przygotowane przez DB) dla try-with-resources pełnego odpowiednika Javy.Moje własne rozwiązanie dla próby braku zasobów Kotlina
Mam realizowane następnego "home-made" rozwiązanie:
inline fun <T:AutoCloseable,R> trywr(closeable: T, block: (T) -> R): R {
try {
return block(closeable);
} finally {
closeable.close()
}
}
Wtedy można go używać następny sposób:
fun countEvents(sc: EventSearchCriteria?): Long {
return trywr(connection.prepareStatement("SELECT COUNT(*) FROM event")) {
var rs = it.executeQuery()
rs.next()
rs.getLong(1)
}
}
Jestem nowy Kotlin i chciałbym wiedzieć, czy brakuje mi czegoś ważnego w swoim własnym rozwiązaniu, które mogłoby spowodować problemy/wycieki w środowisku produkcyjnym.
Powodem nie obsługują 'AutoClosable' out-of-the-box jest to, że są one jeszcze do wdrożenia wsparcia Java8, a także wspierać zajęcia JDK8 – voddan
zawsze można skopiuj źródło dla 'use' i zmień' Closeable' na 'AutoCloseable' (zobacz [ReadWrite.kt: 145-177] (https://github.com/JetBrains/kotlin/blob/8549ec7645ff6db4d5fede2c43034be66683561a/libraries/stdlib/src/ kotlin/io/ReadWrite.kt # L145-L177). – mfulton26
Rozważ użycie java 8 dla wzorca. Możesz go znaleźć tutaj http://stackoverflow.com/a/43269795/2463695 –