我自己的Kotlin解决方案';让我们在没有资源的情况下试一试 > KTILN提供了代码>使用< /COD>函数,用于可关闭对象,但是它们似乎忘记考虑代码>自动关闭< /COD>(例如,DB准备语句),用于资源完全java等价的尝试。
我已经实施了下一个“自制”解决方案:我自己的Kotlin解决方案';让我们在没有资源的情况下试一试 > KTILN提供了代码>使用< /COD>函数,用于可关闭对象,但是它们似乎忘记考虑代码>自动关闭< /COD>(例如,DB准备语句),用于资源完全java等价的尝试。,kotlin,try-with-resources,autocloseable,Kotlin,Try With Resources,Autocloseable,我已经实施了下一个“自制”解决方案: inline fun <T:AutoCloseable,R> trywr(closeable: T, block: (T) -> R): R { try { return block(closeable); } finally { closeable.close() } } 我是Kotlin的新手,我想知道我自己的解决方案中是否遗漏了一些重要的东西,这些东西可能会在生产环境中给我带来
inline fun <T:AutoCloseable,R> trywr(closeable: T, block: (T) -> R): R {
try {
return block(closeable);
} finally {
closeable.close()
}
}
我是Kotlin的新手,我想知道我自己的解决方案中是否遗漏了一些重要的东西,这些东西可能会在生产环境中给我带来问题/泄漏。您的实现可以很好地工作,但它与标准的资源试用实现不同。如果您想让它像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()
}
}
}
inline fun trywr(可关闭:T,块:(T)->R:R{
var currentThrowable:java.lang.Throwable?=null
试一试{
返回块(可关闭)
}捕获(可丢弃:可丢弃){
currentThrowable=可作为java.lang.throwable丢弃
抛掷物
}最后{
如果(currentThrowable!=null){
试一试{
closeable.close()
}捕获(可丢弃:可丢弃){
currentThrowable.addSuppressed(throwable)
}
}否则{
closeable.close()
}
}
}
更新:
正如他在
kotlin.Throwable
中指出的那样,Throwable不包含addsupprested(Throwable)
方法,因此我们必须将kotlin.Throwable
转换为java.lang.Throwable
,以使代码工作。我认为您想要的是Closable
中定义的,因为kotlin 1.1,.use
具有一个可自动关闭的实现
@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)
}
}
@SinceKotlin(“1.1”)
@抑制(“不可见的\u引用”、“不可见的\u成员”)
@kotlin.internal.InlineOnly
公共内联乐趣T.use(block:(T)->R:R{
变量异常:可丢弃?=null
试一试{
返回块(本)
}捕获(e:可丢弃){
异常=e
掷e
}最后{
此.closeFinally(例外)
}
}
从复制他们不支持开箱即用的
自动关闭
的原因是他们仍然要实现Java8支持,以及支持JDK8类。您可以始终复制源代码,以便使用
并将可关闭
更改为可自动关闭
(参见.java)考虑使用该模式。您可以在这里找到“<代码> AdEclipse(可投掷)< /Code >方法>代码> KOTLIN。可投掷< /Code >,并且不能在KTLLIN尝试catch中使用<代码> java .Lang.Primaby//Code >,因此该代码如何编译(除<代码> S/投掷/投掷/< /代码>)?@mfulton26我认为它应该是异常
而不是可丢弃的
@mfulton26谢谢,这是一个很好的观点。更新了代码以使其可编译。
@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)
}
}