小编Mar*_*rio的帖子

Kotlin:"synchronized"使编译器无法确定变量的初始化

让我们假设下一段Kotlin代码通过JDBC连接器对数据库执行一些查询:

    var results : ResultSet
    preparedStatement.clearParameters()
    preparedStatement.setInt(1,value1);
    preparedStatement.setInt(2,value2)
    results = preparedStatement.executeQuery()
    while(results.next()) {
        // parse results
    }
Run Code Online (Sandbox Code Playgroud)

编译没有问题.但是,当我尝试将线程安全性添加到对preparedStatement的访问时:

    var results : ResultSet
    synchronized(preparedStatement) {
        preparedStatement.clearParameters()
        preparedStatement.setInt(1,value1);
        preparedStatement.setInt(2,value2)
        results = preparedStatement.executeQuery()
    }
    while(results.next()) {
        // parse results
    }
Run Code Online (Sandbox Code Playgroud)

...我得到了一个"变量'结果'必须初始化".看起来该synchronized块充当条件块,但您可以确定它将在while块之前执行一次.

我在Java中实现了这个相同的块,但我没有得到错误.这是Kotlin的设计/实现错误吗?或者它有充分的理由表现得那样吗?

synchronized thread-safety kotlin

6
推荐指数
1
解决办法
1753
查看次数

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

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

try-with-resources kotlin autocloseable

6
推荐指数
1
解决办法
761
查看次数