gpt4 book ai didi

android - 显然可以为 null 但实际上不能为 null 的变量的返回值

转载 作者:太空狗 更新时间:2023-10-29 16:29:13 24 4
gpt4 key购买 nike

在 Kotlin 中编写此代码的惯用方法是什么?

   private var someVar: SomeClass? = null

private fun getSomeVar(): SomeClass {
if (someVar == null) {
someVar = getDefaultSomeVar()
}

return someVar
}

Android Studio 警告我返回类型。然而,在 Java 中,这段代码是恰当的和惯用的。我的意思是,与其将返回类型更改为 SomeClass?,也许还有更好的方法?

实际上,getSomeVar() 永远不会返回 null

最佳答案

编译器会提示,因为从理论上讲,不同的线程可以在赋值和返回语句之间更改 someVar

这里惯用的解决方案是使用 property delegation :

private val someVar: SomeClass by lazy { getDefaultSomeVar() }

这会在首次以线程安全方式访问属性时对其进行初始化。另请注意,它现在是一个不可为 null 的 val,而不是一个可为 null 的 var,这使得它通常更易于使用。

您以后确实无法修改它。如果它需要可变,您目前必须自己制作。有关示例实现,请参阅此 SO 问题:Kotlin lazy default property


以下两个解决方案将问题中的方法('java 方式')视为理所当然,只是展示了一种防止编译器警告的方法。但是,在您的情况下,这些是建议的,因为它们都比惰性初始化属性有缺点:

1) 引入局部变量。这个变量是安全的,不会被其他线程改变,并允许编译器进行智能转换:

private fun getSomeVar(): SomeClass {
var value = someVar
if(value == null) {
value = getDefaultSomeVar()
someVar = value
}

return value
}

但是该方法本身仍然不是线程安全的。在多线程环境下,getDefaultSomeVar()可以被多次调用,不保证该方法的返回值等于someVar

2) 使用!!:双爆炸运算符。这会将可空类型转换为不可空类型。但是现在你失去了保护和null safety kotlin 编译器对你强制执行。

return someVar!!

正如文档所说:“如果你想要一个 NPE,你可以拥有它”

关于android - 显然可以为 null 但实际上不能为 null 的变量的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43422920/

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