Kotlin对象比较注意的点是什么
发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,这篇文章主要介绍"Kotlin对象比较注意的点是什么"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Kotlin对象比较注意的点是什么"文章能帮助大家解决问题。
千家信息网最后更新 2024年11月20日Kotlin对象比较注意的点是什么
这篇文章主要介绍"Kotlin对象比较注意的点是什么"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Kotlin对象比较注意的点是什么"文章能帮助大家解决问题。
背景
现有一个StateFlow及其监听
privateval stateFlow = MutableStateFlow(kotlin.Pair>("abc", ArrayList()))
GlobalScope.launch { stateFlow.collect { // do something }}
更新ArrayList并尝试emit
GlobalScope.launch { stateFlow.value.second.add("test") stateFlow.emit(stateFlow.value)}
实际上,collect并不会被调用
原因
MutableStateFlow真正的实现者是StateFlowImpl, emit方法代码如下:
override suspend fun emit(value: T) { this.value = value}
查看value的set方法:
public override var value: T get() = NULL.unbox(_state.value) set(value) { updateState(null, value ?: NULL) }
private fun updateState(expectedState: Any?, newState: Any): Boolean { var curSequence = 0 var curSlots: Array? = this.slots // benign race, we will not use it synchronized(this) { val oldState = _state.value if (expectedState != null && oldState != expectedState) return false // CAS support if (oldState == newState) return true // Don't do anything if value is not changing, but CAS -> true _state.value = newState curSequence = sequence ... 省略部分代码 }}
其中"if (oldState == newState) return true"因emit前后是同一个对象,导致条件为true,那么,如果emit前后不是同一个对象,即可解决这个问题?
另一个问题
emit时尝试以下代码:
GlobalScope.launch { stateFlow.value.apply { stateFlow.emit(kotlin.Pair(first, second)) }}
实际上,上述代码仍旧不能解决问题,因为kotlin.Pair默认重写了equals方法,查看kotlin.Pair decompiled的Java文件
public final class Pair { public int hashCode() { Object var10000 = this.first; int var1 = (var10000 != null ? var10000.hashCode() : 0) * 31; Object var10001 = this.second; return var1 + (var10001 != null ? var10001.hashCode() : 0); } public boolean equals(@Nullable Object var1) { if (this != var1) { if (var1 instanceof Te.Pair) { Te.Pair var2 = (Te.Pair) var1; if (Intrinsics.areEqual(this.first, var2.first) && Intrinsics.areEqual(this.second, var2.second)) { return true; } } return false; } else { return true; } }}
其中Intrinsics.areEqual代码如下:
public static boolean areEqual(Object first, Object second) { return first == null ? second == null : first.equals(second);}
故即使pair对象本身不一样,但由于kotlin默认重写了equals方法,而pair.first与pair.second是一样的,从而条件"if (oldState == newState) return true"成立
解决办法
由于StateFlow源码无法修改且是特定场景需求,故无法将判断条件改为kotlin的"===";故使用android.util.Pair或者自定义java Pair class即可
关于"Kotlin对象比较注意的点是什么"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。
对象
代码
方法
问题
实际
条件
知识
实际上
行业
尝试
更新
不同
实用
内容
办法
原因
场景
实现者
实用性
文件
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
超神学院没有服务器怎么办
网络安全赋能发展
李某入职某软件开发公司
衡阳软件开发的学校
云服务器屏幕中间的ip
河北MAC软件开发
梁溪区软件开发市场价格
仙某某帝国神话服务器名字
汕头汽车软件开发咨询
倩女角色服务器查询
html编辑器 数据库
服务器配置pen证书
互联网科技是哪些行业
浙江通用服务器
免签支付软件开发
丽水软件开发设计
北京聚优创互联网科技
学习计算机网络技术的书
达梦数据库视图连接另一个数据库
网络技术是叫vb吗
网络安全危害文章
JJ斗地主服务器
汕头汽车软件开发咨询
如何加强校园网络安全防护
vivo最快的服务器
2018网络技术三级
魔力回忆没有服务器
服务器之间的通讯
山东思跃互联网科技有限公司
玉蜂优创网络技术有限公司