我最近发现自己在编写以下代码:
fun listener() {
// Do some stuff
adapter.removeLoadStateListener(::listener)
}
adapter.addLoadStateListener(::listener)
一位同事提到了这件事情
val x1 = ::listener
val x2 = ::listener
x1 == x2 //true
x1 === x2 //false
然而,
var mySet = mutableSetOf<() -> Unit>()
fun a() { }
fun b() { }
mySet.add(::a)
mySet.add(::b)
mySet.remove(::a)
mySet.contains(::a) // false
mySet.contains(::b) // true
根据这个,我得出的印象是我没有正确理解 "::myFun",我开始质疑我的原始代码是否安全可用。
TL;DR:
1.使用 "::listener" 来引用需要被多次引用的方法(例如添加 + 删除)作为监听器是否安全? 2.关于匿名类等实际上正在发生什么?
编辑:
最终,我们决定不在此情况下使用 "::listener"。然而,我们遇到了一个新问题,因为 "add/removeLoadStateListener" 只接受 "(CombinedLoadState) -> Unit" 类型。
我会留下我们对该问题的解决方案供未来参考以及其他读者查看,因为它是相关的(我甚至希望有些人会在这里寻找答案,而不是寻找原始问题的答案)。
val listener = object : (CombinedLoadStates) -> Unit {
override operator fun invoke(loadState: CombinedLoadStates) {
// Do some stuff
adapter.removeLoadStateListener(this)
}
}
adapter.addLoadStateListener(listener)
setListener
,而其他类则是addListener
。 - cutiko::a
条目实际上被删除了,尽管变量示例表明::a !== ::a
。 - Felix ZY