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

Mar*_*rio 6 try-with-resources kotlin autocloseable

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以用下一个方法:

fun countEvents(sc: EventSearchCriteria?): Long {
    return trywr(connection.prepareStatement("SELECT COUNT(*) FROM event")) {
        var rs = it.executeQuery()
        rs.next()
        rs.getLong(1)
    }
}
Run Code Online (Sandbox Code Playgroud)

我是Kotlin的新手,我想知道我是否遗漏了一些在我自己的解决方案中可能会给我带来生产环境中的问题/泄漏的重要内容.

Mic*_*ael 7

您的实现将正常工作,但它与标准的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()
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

更新:

正如mfulton26在他的评论 kotlin.Throwable中指出的那样,不包含addSuppressed(Throwable)方法所以我们必须强制kotlin.Throwable转换java.lang.Throwable才能使代码工作.