Kotlin零安全的最佳实践

Kotlin零安全的最佳实践,kotlin,kotlin-null-safety,Kotlin,Kotlin Null Safety,我目前正在学习Kotlin在我的android应用程序中取代Java,但我正在努力解决空安全问题 我已经熟悉了处理空变量和非空变量的过程,但我仍然不确定Kotlin中实现空/非空变量的“最佳实践” 例如,在Java中,我会编写如下内容: UserAccount account; if (account == null) { openLogin(); } 我知道我可以在Kotlin中复制这一点,但似乎这种语言是为了避免这样的练习而设计的。我应该如何通过Kotlin来实现这个系统,我应该

我目前正在学习Kotlin在我的android应用程序中取代Java,但我正在努力解决空安全问题

我已经熟悉了处理空变量和非空变量的过程,但我仍然不确定Kotlin中实现空/非空变量的“最佳实践”

例如,在Java中,我会编写如下内容:

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()
}