You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义lazy实现中,如何指定key函数检测对象引用变化?

解决方法

要检测变量x指向的对象是否变化,本质是要做引用相等判断(Kotlin中的===运算符),针对你的需求,有两种可行方案:

方案一:用对象本身作为key,结合引用相等比较

你不需要找对象独有的特殊值,直接把当前的x引用作为key函数的返回值即可。修改代码如下:

var x = MyClass()

val myValue by lazy(key = { x }) { 
    // 初始化逻辑
}

然后在你的自定义lazy实现中,比较前后两次key函数的返回值时,不要用默认的==(会调用equals()),而是改用===判断引用是否相同。这样只要x指向新对象,key值就会变化,触发初始化器重新执行。这种方式是最可靠的,直接基于对象引用比较,不会有哈希冲突的风险。

方案二:扩展自定义lazy,支持自定义相等判断函数

如果你的lazy实现目前只支持key函数,不支持自定义相等逻辑,那可以扩展它,让它接受一个(oldKey: KeyType, newKey: KeyType) -> Boolean类型的参数,默认用==,需要时传入引用相等的判断逻辑:

// 扩展后的lazy函数定义示例
fun <T> lazy(
    key: () -> Any?,
    equals: (oldKey: Any?, newKey: Any?) -> Boolean = { old, new -> old == new },
    initializer: () -> T
): Lazy<T> {
    // 实现逻辑:每次访问时调用key函数,用equals判断是否变化,变化则重新初始化
}

// 使用时传入引用相等判断
val myValue by lazy(
    key = { x },
    equals = { a, b -> a === b }
) {
    // 初始化逻辑
}

这种方式灵活性更高,既保留默认的相等判断逻辑,也能按需切换成引用相等,完全适配你的场景。


内容的提问来源于stack exchange,提问作者askSoap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:33:12