千家信息网

Kotlin对象比较注意的点是什么

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"Kotlin对象比较注意的点是什么"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Kotlin对象比较注意的点是什么"文章能帮助大家解决问题。
千家信息网最后更新 2026年11月02日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安全错误 数据库的锁怎样保障安全 深圳恒合互联网络科技有限公司 科技互联网龙头 互联网科技公司税收优惠 互联网扶贫科技 互联网 科技 九亚互联网科技 无线互联网科技 互联网养老 桔豆科技 广西拼得多互联网科技有限公司 成都玖崟互联网科技有限公司乐商圈怎么样 字节跳动和互联网科技 承德科技产业互联网发展 昭通互联网科技选哪家 中国航天科技大学国际工业互联网 电子科技大学互联网创业大赛 浙南科技城互联网大厦招聘 普陀区互联网教育科技管理办法 广州智享互联网科技 互联网金融运营模式中的金融科技 唐山双旺合互联网科技产业园 互联网科技有限公司图片 猪兼强互联网科技 凡科互联网科技 隆华科技工业互联网 欧洲十大科技互联网公司 科技互联网的核心竞争力 北京市互联网新科技 互联网与数字科技关系 知域互联网科技有限公司官网 颐高云石互联网科技
0