Kotlin为Closeable
对象提供了use
函数,但似乎忘记考虑AutoCloseable
(例如DB准备语句)的资源尝试与Java完全等效。我自己的解决方案Kotlin的尝试与资源缺席
我实现下一个“自制”的解决方案:
inline fun <T:AutoCloseable,R> trywr(closeable: T, block: (T) -> R): R {
try {
return block(closeable);
} finally {
closeable.close()
}
}
然后你可以使用它的下一个方法:
fun countEvents(sc: EventSearchCriteria?): Long {
return trywr(connection.prepareStatement("SELECT COUNT(*) FROM event")) {
var rs = it.executeQuery()
rs.next()
rs.getLong(1)
}
}
我是新来的科特林,我想了解我是否在自己的解决方案中丢失了一些重要的东西,这可能会在生产环境中给我带来问题/泄漏。
他们之所以不支持'AutoClosable'出的现成的是,他们仍然实现Java8支持,以及支持JDK8类 – voddan
你总是能复制复制'use'的源代码并将'Closeable'改为'AutoCloseable'(参见[ReadWrite.kt:145-177](https://github.com/JetBrains/kotlin/blob/8549ec7645ff6db4d5fede2c43034be66683561a/libraries/stdlib/src/) kotlin/io/ReadWrite.kt#L145-L177) – mfulton26
考虑使用java 8作为模式,你可以在这里找到http://stackoverflow.com/a/43269795/2463695 –