Kotlin 空安全

前言

当我们使用 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 操作符配合安全调用符,实现简单清晰的空检查和空操作。

转化关系:

  • A ?: B 等价 if (A == null) B
  • A?.B ?: C等价 if (A != null) A.B else C

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

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)
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 可空类型与非空类型 在 Kotlin 中,类型分为可空引用和非空引用。例如,String 类型的常规变量不能容纳 ...
    李庆雪阅读 3,733评论 0 3
  • 本文是在学习和使用kotlin时的一些总结与体会,一些代码示例来自于网络或Kotlin官方文档,持续更新... 对...
    竹尘居士阅读 3,379评论 0 8
  • 空安全 可空类型和非空类型 在 Kotlin 类型系统中可以为空和不可为空的引用是不同的。比如,普通的 Strin...
    小浩_w阅读 295评论 0 0
  • 写在开头:本人打算开始写一个Kotlin系列的教程,一是使自己记忆和理解的更加深刻,二是可以分享给同样想学习Kot...
    胡奚冰阅读 937评论 2 4
  • 来简书的第一天,没什么就单纯的想练习一下自己的文笔!接下来打算每天记录自己一天发生的小事情呀,希望能坚持下来!
    Windky_Chang阅读 145评论 0 1