Kotlin 空安全

2019-04-10  本文已影响0人  cgzysan

前言

当我们使用 Java 开发的时候,如果不想遇到 NullPointerException,我们就需要在使用它之前不停的判断它是否为 null,而 Kotlin 是空安全的,我们在编译时期就处理了各种 null 的情况,避免了执行时异常。

空安全

// 不能通过编译,Artist 不能是 null
var notNullArtist : Artist = null

// Artist 可以是 null
var artist: Artist? = null

// 无法编译, artist可能是null,我们需要进行处理
artist.print()

// 只要在artist != null时才会打印
artist?.print()

// 只有在确保artist不是null的情况下才能这么调用,否则它会抛出异常
artist!!.print()

// 使用Elvis操作符来给定一个在是null的情况下的替代值
val name = artist?.name ?: "empty"
1. 安全调用符 ?.

?. 会被编译为一个三目运算表达式,如果 ?. 前的对象不为 null,则调用 ?. 后的方法或属性,否则返回 null。

2. Elvis 操作符 ?:

Elvis 操作符是三目条件运算符的简略写法,用于指出一个是 null 的情况下的替代值。

Kotlin 中可以用 Elvis 操作符配合安全调用符,实现简单清晰的空检查和空操作。

转化关系:

不建议广泛使用!!操作符

Kotlin 不建议在代码中广泛使用 !! 操作符,这回浪费 Kotlin 设计良好的非空类型,每一个 !! 都意味着一个未处理的 NullPointerException ,让 Kotlin 代码充斥着 NPE

1. 用 val 而不是 var

在 Kotlin 中 val 代表只读,var 代表可变。val 是线程安全的,而且不需要担心 null 的问题。

2. 使用lateinit

在 Android 定义一些成员变量的时候,经常需要在 onCreate 方法中初始化,这个时候我们就用不了 val,针对这种情况,Kotlin 提供了 lateinit 关键字,就和其表面意思一样,“晚些初始化”。

3. 使用 Elvis 操作符

指出一个 null 情况下的替代值。

4. 使用 let 函数

let 函数定义就是,默认当前这个对象作为闭包的it参数,可以 return 返回函数的执行结果。一般要与安全调用符配合使用:

private var msg: String? = null

fun main(args: Array<String>) {
    msg = "Kotlin from ysan"
    var a = msg?.let { sendMessage(it) }
}

fun sendMessage(message : String) {
    for (s in message) {
        println(s)
    }
}
上一篇 下一篇

猜你喜欢

热点阅读