Kotlin中零安全的最佳实践

Cam*_*lMG 2 kotlin kotlin-null-safety

我目前正在学习Kotlin,以在我的android应用程序中替换Java,但正在努力确保安全性。

我已经熟悉处理null和non-null变量的过程,但是,我仍然不确定Kotlin中实现null / non-null变量方面的“最佳实践”。

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

UserAccount account;

if (account == null) {
    openLogin();
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以在Kotlin中复制此语言,但似乎该语言旨在避免这种做法。我应该如何通过Kotlin实施此系统,我应该添加可为空的变量吗?

小智 5

该材料可能很有用:http : //www.baeldung.com/kotlin-null-safety

您可以搜索let()和run()方法。

let()方法

要仅在引用持有非空值时执行操作,我们可以使用let运算符。

假设我们有一个值列表,并且该列表中还有一个空值:

val firstName = "Tom"
val secondName = "Michael" val names:
List<String?> = listOf(firstName, null, secondName)
Run Code Online (Sandbox Code Playgroud)

接下来,我们可以使用let函数对名称列表中的每个非空元素执行操作:

var res = listOf<String?>() for (item in names) {
     item?.let { res = res.plus(it) } }   
assertEquals(2, res.size)
assertTrue { res.contains(firstName) } 
assertTrue { res.contains(secondName) }
Run Code Online (Sandbox Code Playgroud)

run()方法

Kotlin有一个run()方法来对可为空的引用执行一些操作。它与let()非常相似,但在函数体内,run()方法在此引用上运行,而不是在函数参数上运行:

var res = listOf<String?>()
for (item in names) {
    item?.run{res = res.plus(this)}
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*nik 5

我知道我可以在Kotlin中复制此语言,但似乎该语言旨在避免这种做法。

请注意没有空值的语言和空值安全的语言之间的区别。Kotlin是后者,这意味着它欢迎并拥抱其null价值,但与Java之类的语言相反,它束缚了它的价值。

Kotlin为您提供语法,以简洁,可读和安全的方式处理可为空的类型。例如,

if (account == null){
    openLogin();
}
Run Code Online (Sandbox Code Playgroud)

您可以使用以下成语:

account ?: openLogin()
Run Code Online (Sandbox Code Playgroud)

在其他时候,您可能想要对非null采取行动,account或者只是跳过部分代码(如果为)null。然后,您可以使用可选的derefence ?.

account?.userName?.also { println("Username is $it") }
Run Code Online (Sandbox Code Playgroud)