gpt4 book ai didi

kotlin - 奇怪的 Kotlin null 安全行为

转载 作者:行者123 更新时间:2023-12-02 04:04:36 25 4
gpt4 key购买 nike

如果全局属性定义为private var raceLoadJob: Job? = null 那么 Kotlin 会要求你在你的方法中做类似的事情

if (raceLoadJob != null){
if (raceLoadJob!!.isActive) return // null assertation
}

Kotlin 会要求断言,因为 raceLoadJob 值可以更改。我首先想到的是多线程。

所以你可以将代码更改为

raceLoadJob?.let {
if (it.isActive) return
}

但是如果你反编译这部分代码你会看到

Job var10000 = this.raceLoadJob;
if (this.raceLoadJob != null) {
Job var1 = var10000;
if (var1.isActive()) {
return;
}
}

您可以看到,该条件是 this.raceLoadJob != null,而不是 var10000 != null。这意味着理论上此代码可能会失败,因为已分配了 raceLoadJob 值,但 var10000 为 null

这是一个问题还是我的推理有错误?

最佳答案

您推理中的错误是您通过查看反编译器输出而不是字节码来分析 Kotlin 代码的行为。 Kotlin 编译器生成 javac 不使用的字节码模式,因此反编译器(旨在反编译 javac 输出)只能提供实际逻辑的近似表示。

如果你看一下实际的字节码,它看起来像这样:

ALOAD 0
GETFIELD raceLoadJob : LRaceLoadJob;
DUP
IFNULL L1
ASTORE 2

它表明检查 null 的值与后续计算中使用的值完全相同。

关于kotlin - 奇怪的 Kotlin null 安全行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53518655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com