自定义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
相关产品推荐
相关产品推荐

