Kotlin零安全的最佳实践
我目前正在学习Kotlin在我的android应用程序中取代Java,但我正在努力解决空安全问题 我已经熟悉了处理空变量和非空变量的过程,但我仍然不确定Kotlin中实现空/非空变量的“最佳实践” 例如,在Java中,我会编写如下内容:Kotlin零安全的最佳实践,kotlin,kotlin-null-safety,Kotlin,Kotlin Null Safety,我目前正在学习Kotlin在我的android应用程序中取代Java,但我正在努力解决空安全问题 我已经熟悉了处理空变量和非空变量的过程,但我仍然不确定Kotlin中实现空/非空变量的“最佳实践” 例如,在Java中,我会编写如下内容: UserAccount account; if (account == null) { openLogin(); } 我知道我可以在Kotlin中复制这一点,但似乎这种语言是为了避免这样的练习而设计的。我应该如何通过Kotlin来实现这个系统,我应该
UserAccount account;
if (account == null) {
openLogin();
}
我知道我可以在Kotlin中复制这一点,但似乎这种语言是为了避免这样的练习而设计的。我应该如何通过Kotlin来实现这个系统,我应该添加一个可为空的变量吗?很可能这个材料会有用: 您可以搜索let()和run()方法 let()方法 仅当引用包含 不可为null的值,我们可以使用let运算符 假设我们有一个值列表,还有一个空值 在该清单中:
val firstName=“汤姆”
val secondName=“Michael”val名称:
List=listOf(firstName,null,secondName)
接下来,我们可以使用let函数对名称列表的每个不可为空的元素执行一个操作:
var res=listOf()(名称中的项){
项目?.let{res=res.plus(it)}
资产质量(2个,大小)
assertTrue{res.contains(firstName)}
assertTrue{res.contains(secondName)}
run()方法
Kotlin有一个run()方法来执行某些操作
在可为空的引用上。它与let()非常相似,但在
函数体中,run()方法对该引用而不是
函数参数:
var res=listOf()
用于(名称中的项目){
项目?.run{res=res.plus(this)}
}
我知道我可以在Kotlin中复制这一点,但似乎这种语言是为了避免这样的练习而设计的
请注意无空语言和空安全语言之间的区别。Kotlin是后者,这意味着它欢迎并接受null
值,但与Java这样的语言不同,它受到了约束
Kotlin为您提供了以简洁、可读和安全的方式处理可空类型的语法。以你为例,
if (account == null){
openLogin();
}
您可以使用以下习惯用法:
account ?: openLogin()
在其他时刻,您可能希望对非空的帐户
执行操作,或者如果该部分代码为null
,则跳过该部分代码。然后,您可以使用可选的解除隔离?。
:
account?.userName?.also { println("Username is $it") }
我知道我可以在Kotlin中复制这一点,但似乎这种语言是为了避免这样的练习而设计的
我会说恰恰相反,它的设计是为了支持它。如果你有
val account: UserAccount? = ...
if (account == null){
openLogin()
} else {
...
}
编译器知道account
在else
分支中不是null
,并且它可以有效地在那里使用不可为null的UserAccount
类型。(小提示:在您的情况下,帐户
更可能是一个var
,这对智能转换造成了一些限制。)
我应该如何通过Kotlin实现这个系统,我应该添加一个可为null的变量吗
您不添加变量,而是指定account
在其类型中可为空
但是,对于这种特定情况,根据您的要求,最好使用:
lateinit var account: UserAccount
...
if (!::account.isInitialized) {
openLogin()
}
大家好,欢迎光临。你看过医生了吗?谢谢我有过,它很好地概述了如何在语言中使用空变量,并建议可以完全避免它们,但我不确定如何真正做到这一点。如何用Kotlin编写代码片段?我应该添加一个可为空的变量吗?我是否应该以某种方式重写系统以避免添加null测试?我不确定在kotlin中该怎么做,但您应该这样做:
Object smObj=null代码>smObj.toString()代码>这取决于帐户
实际可以为空的情况。它是否只有“开始”空值?如果没有错误,它是否会为null?因此,在这种情况下,用户打开应用程序时没有帐户,因此在Java中它将为null,这是一种预期状态。这可以在Kotlin中复制吗,或者我应该添加一些其他检查以避免出现空帐户的可能性?我试图避免的是将Java的逻辑应用到Kotlin,在Kotlin中可能会有更有效的本机方法。
account?.userName?.also { println("Username is $it") }
val account: UserAccount? = ...
if (account == null){
openLogin()
} else {
...
}
lateinit var account: UserAccount
...
if (!::account.isInitialized) {
openLogin()
}