Kotlin 提供了use
函数为Closeable
对象,但似乎他们忘记考虑AutoCloseable
(例如 DB 准备好的语句)用于 try-with-resources 完整的 Java 等效项。
我已经实施了下一个“自制”解决方案:
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)
}
}
我是 Kotlin 新手,我想知道我自己的解决方案中是否遗漏了一些重要的东西,这些东西可能会给我在生产环境中带来问题/泄漏。
您的实现可以正常工作,但它与标准的 try-with-resources 实现不同。如果你想让它像 Java 一样工作,你应该这样做:
inline fun <T : AutoCloseable, R> trywr(closeable: T, block: (T) -> R): R {
var currentThrowable: java.lang.Throwable? = null
try {
return block(closeable)
} catch (throwable: Throwable) {
currentThrowable = throwable as java.lang.Throwable
throw throwable
} finally {
if (currentThrowable != null) {
try {
closeable.close()
} catch (throwable: Throwable) {
currentThrowable.addSuppressed(throwable)
}
} else {
closeable.close()
}
}
}
UPDATE:
As 富尔顿26在他的书中指出comment kotlin.Throwable
不包含addSuppressed(Throwable)
方法所以我们必须强制转换kotlin.Throwable
to java.lang.Throwable
使代码工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)