Tag: autocloseable

为什么使用块不能安全地初始化一个var?

为什么这给编译错误? val autoClosable = MyAutoClosable() var myVar: MyType autoClosable.use { myVar= it.foo() } println(myVar) // Error: Variable ‘myVar’ must be initialized 也许编译器只是把{ myVar= it.foo() }作为一个函数传递给另一个函数,并且不知道什么时候,甚至是否会被执行? 但是由于use不仅仅是一个函数,而且Kotlin已经替代了Java的“试用资源”,关于它的一些特殊的知识将是适当的,不是吗? 现在,我不得不用一些虚拟的价值初始化myVar ,这完全不符合Kotlin的精神。

为什么使用块不能安全地初始化一个var?

为什么这给编译错误? val autoClosable = MyAutoClosable() var myVar: MyType autoClosable.use { myVar= it.foo() } println(myVar) // Error: Variable 'myVar' must be initialized 也许编译器只是把{ myVar= it.foo() }作为一个函数传递给另一个函数,并且不知道什么时候,甚至是否会被执行? 但是由于use不仅仅是一个函数,而且Kotlin已经替代了Java的“试用资源”,关于它的一些特殊的知识将是适当的,不是吗? 现在,我不得不用一些虚拟的价值初始化myVar ,这完全不符合Kotlin的精神。

我自己的解决方案,Kotlin的尝试与资源缺席

Kotlin提供了可Closeable对象的use函数,但似乎忘记考虑AutoCloseable (例如,数据库准备语句)的资源尝试与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的新手,我想知道是否在自己的解决方案中丢失了一些重要的东西,这可能会在生产环境中给我带来问题/泄漏。