Kotlin为use
对象提供Closeable
函数,但似乎他们忘记考虑{-1}}(例如DB预处理语句)for try-with-resources完全Java等价物。 / p>
我实施了下一个"自制"溶液:
AutoCloseable
然后您可以通过下一种方式使用它:
inline fun <T:AutoCloseable,R> trywr(closeable: T, block: (T) -> R): R {
try {
return block(closeable);
} finally {
closeable.close()
}
}
我是Kotlin的新手,我想知道我是否遗漏了一些在我自己的解决方案中可能会在生产环境中出现问题/泄漏的重要内容。
答案 0 :(得分:7)
您的实施工作正常,但它与标准的资源尝试实施不同。如果你希望它像在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()
}
}
}
<强>更新强>:
由于mfulton26 kotlin.Throwable
中指出的comment不包含addSuppressed(Throwable)
方法,因此我们必须将kotlin.Throwable
强制转换为java.lang.Throwable
使代码有效。
答案 1 :(得分:2)
自Kotlin 1.1起,.use
实施AutoCloseable
。
@SinceKotlin("1.1")
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
@kotlin.internal.InlineOnly
public inline fun <T : AutoCloseable?, R> T.use(block: (T) -> R): R {
var exception: Throwable? = null
try {
return block(this)
} catch (e: Throwable) {
exception = e
throw e
} finally {
this.closeFinally(exception)
}
}
复制
答案 2 :(得分:0)
我认为您想要的是Closable
上定义的use()
。