返回顶部
首页 > 资讯 > 精选 >Kotlin对象比较注意的点是什么
  • 346
分享到

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

2023-06-30 04:06:09 346人浏览 独家记忆
摘要

这篇文章主要介绍“Kotlin对象比较注意的点是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Kotlin对象比较注意的点是什么”文章能帮助大家解决问题。背景现有一个StateFlow及其监听p

这篇文章主要介绍“Kotlin对象比较注意的点是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Kotlin对象比较注意的点是什么”文章能帮助大家解决问题。

背景

  • 现有一个StateFlow及其监听

private val stateFlow = MutableStateFlow(kotlin.Pair<String, ArrayList<String>>("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<StateFlowSlot?>? = 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对象比较注意的点是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Kotlin对象比较注意的点是什么

本文链接: https://lsjlt.com/news/327386.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Kotlin对象比较注意的点是什么
    这篇文章主要介绍“Kotlin对象比较注意的点是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Kotlin对象比较注意的点是什么”文章能帮助大家解决问题。背景现有一个StateFlow及其监听p...
    99+
    2023-06-30
  • Kotlin对象比较注意点示例详解
    目录背景原因另一个问题解决办法结论背景 现有一个StateFlow及其监听 private val stateFlow = MutableStateFlow(kotlin.Pair&...
    99+
    2024-04-02
  • java怎么比较对象是否相等
    在Java中,可以使用以下几种方法来比较对象是否相等: 使用`==`运算符:`==`运算符用于比较两个对象的引用是否相等,即是否...
    99+
    2023-10-28
    java
  • PHP浮点数比较的注意事项与技巧
    PHP作为一种常用的服务器端脚本语言,经常会涉及到浮点数的比较操作。然而,由于浮点数的精度问题,使用不当很容易导致比较结果出现意外情况。在本文中,我们将就PHP浮点数比较的注意事项与技...
    99+
    2024-03-08
    php 比较 浮点数
  • javascript的对象是什么意思
    这篇文章主要讲解了“javascript的对象是什么意思”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript的对象是什么意思”吧! ...
    99+
    2024-04-02
  • jquery对象是什么意思
    这篇文章主要介绍了jquery对象是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 在jquery中,j...
    99+
    2024-04-02
  • JScript对象是什么意思
    这篇文章给大家分享的是有关JScript对象是什么意思的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Jscript 对象是属性和方法的集合。一个方法就是一个函数,是对象的成员。属性是一个值或一组值(以数组或对象的...
    99+
    2023-06-03
  • AUTHID CURRENT_USER的注意点是什么
    这篇文章主要讲解了“AUTHID CURRENT_USER的注意点是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“AUTHID CURRENT_USER...
    99+
    2024-04-02
  • java怎么比较两个对象的内容
    在Java中比较两个对象的内容通常有以下几种方法: 使用equals()方法:重写equals()方法可以比较两个对象的内容。eq...
    99+
    2023-10-28
    java
  • php中比较运算符是什么意思
    在php中,比较运算符是允许对两个值进行比较的一种符号;当用运算符比较两个值时,结果是一个逻辑值:TRUE(成立)或FALSE(不成立)。php比较运算符中,“==”和“===”可进行相等比较,“!=”、“<>”和“!==”可进...
    99+
    2024-04-02
  • js对象指的是什么意思
    这篇文章将为大家详细讲解有关js对象指的是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JavaScript的特点1.JavaScript主要用来向HTML页面添加交互行为。2.JavaScrip...
    99+
    2023-06-14
  • 比较JavaScript日期对象时踩的坑是怎样的
    本篇文章为大家展示了比较JavaScript日期对象时踩的坑是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。直觉上,两个相同的日期之间比较应该是相等的,然而结...
    99+
    2024-04-02
  • Javascript Functuion对象的特点是什么
    本篇内容主要讲解“Javascript Functuion对象的特点是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Javascript Functuion对象的特点是什么”吧!特点方法的定...
    99+
    2023-06-20
  • AOP.NET DataAdapter对象是什么意思
    这篇文章给大家分享的是有关AOP.NET DataAdapter对象是什么意思的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。AOP.NET DataAdapter对象表示一组数据命令和一个数据库连接,用于填充Da...
    99+
    2023-06-17
  • mongodb对比mysql的优缺点是什么
    本文主要给大家简单讲讲mongodb对比mysql的优缺点是什么,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望mongodb对比mysql的优缺点是什么这篇...
    99+
    2024-04-02
  • 比较JavaScript 对象的四种方式分别是怎样的
    比较JavaScript 对象的四种方式分别是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 比较 JavaS...
    99+
    2024-04-02
  • JavaScript对象标注的方法是什么
    这篇文章主要介绍“JavaScript对象标注的方法是什么”,在日常操作中,相信很多人在JavaScript对象标注的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript对象标注的方法...
    99+
    2023-06-03
  • python中面向对象的注意点概述总结
    目录一、继承二、是否继承object类的区别三、封装四、类方法、静态方法与属性方法五、多态六、python是否存在实质意义上的私有变量?总结一、继承 与java的继承不同python...
    99+
    2024-04-02
  • jspXCMS中Special对象是什么意思
    这篇文章给大家分享的是有关jspXCMS中Special对象是什么意思的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。专题对象。类名:com.jspxcms.core.domain.Special。customs:...
    99+
    2023-06-26
  • php面向对象指的是什么意思
    这篇文章主要为大家展示了“php面向对象指的是什么意思”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“php面向对象指的是什么意思”这篇文章吧。在php中,面向对象就是将要处理的问题抽象为对象,然...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作