我可以在Kotlin中访问内联函数调用的“封闭”对象吗?

时间:2017-12-08 20:30:08

标签: kotlin

想法:创建一个内联的便利函数来同步“内联”对象的内部锁定上的函数调用:

public inline fun <T> intrinsicSync(block: () -> T): T {
    return synchronized(intrinsicLockOfTheObjectUsingTheFunction) {
        block()
    }
}

fun someFunction(parameter: SomeClass) {
    intrinsicSync(sharedResource.operation(parameter))
}

这可能吗?如果没有,是否有不同但同样方便的方式?我承认

fun someFunction(parameter: SomeClass) {
    synchronized(this) {
        sharedResource.operation(parameter)
    }
}

不是世界上最大的麻烦,但我仍然想知道是否有可能做出类似我想象的事情。

1 个答案:

答案 0 :(得分:2)

你能做的最多就是给函数一个接收器(即使它成为一个扩展函数):

public inline fun <T> Any.intrinsicSync(crossinline block: () -> T): T {
                   // ^ within this function, `this` refers to the receiver
    return synchronized(this, block)
}

然后在成员函数中,您可以执行

this.intrinsicSync { sharedResource.operation() }

从推断出this后,您应该可以将其缩短为

intrinsicSync { sharedResource.operation() }

请记住,扩展函数不能影子成员函数,因此如果此对象具有相同签名的其他函数,则不会选择扩展函数。

在你的情况下,这似乎不太可能。