美文网首页
Kotlin 空安全

Kotlin 空安全

作者: cgzysan | 来源:发表于2019-04-10 16:48 被阅读0次

    前言

    当我们使用 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 空安全

          本文链接:https://www.haomeiwen.com/subject/jeroiqtx.html