Kotlin对象比较注意的点是什么
发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,这篇文章主要介绍"Kotlin对象比较注意的点是什么"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Kotlin对象比较注意的点是什么"文章能帮助大家解决问题。
千家信息网最后更新 2025年11月09日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安全错误
数据库的锁怎样保障安全
华为软件开发云 网址
php 前端直接导出数据库结构
网络技术和校园生活感悟
紧守网络安全
央行网络安全态势
网络安全审批
jsp页面放入数据库
我的世界服务器禁止
415国家安全日网络安全知识
软件开发哪家大学好
众奥通网络技术培训橙子老师
服务器 测试
2020年国家网络安全作文
惠普的服务器为什么复制不了硬盘
34岁学习软件开发
web服务器的三个核心协议
广西高清视频会议服务器
音频管理服务器厂家
化学计算机软件开发就业前景
各系统的服务器管理器
在美国软件开发经理的收入
安卓平板服务器
网络安全管理工作原则有哪几项
NC608BR串口服务器
415国家安全日网络安全知识
最强二次元网络技术
网络监控服务器搭建
部队数据库职工工资核算
网络安全与运维基础
中国青岛网络安全产业园