我自己的解决方案是Kotlin尝试缺少资源

时间:2016-03-28 10:35:54

标签: kotlin try-with-resources autocloseable

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的新手,我想知道我是否遗漏了一些在我自己的解决方案中可能会在生产环境中出现问题/泄漏的重要内容。

3 个答案:

答案 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)
    }
}

source

复制

答案 2 :(得分:0)

我认为您想要的是Closable上定义的use()