【koltlin】Kotlin关于isNullOrEmpty()函数引发的思考

在kotlin中经常看到这样的if语句:

//s是一个String类型的对象
if(s.isNullOrEmpty()){
    
    
//执行空对象或空字符串的逻辑
}

笔者不禁想问,如果s是空对象,调用它的函数不会抛出空指针吗?

它是如何检查被调用的对象s是空对象的呢?

查阅资料后,发现原来这是kotlin的扩展函数的特性:

被扩展的类后面添加?.再接扩展函数名即表示可以在空对象上扩展。在扩展函数内, 可以通过 this 来判断接收者是否为 NULL,这样,即使接收者为 NULL,也可以调用扩展函数。例如:

fun Any?.toString(): String {
    
    
    if (this == null) return "null"
    // 空检测之后,“this”会自动转换为非空类型,所以下面的 toString()
    // 解析为 Any 类的成员函数
    return toString()
}
fun main(arg:Array<String>){
    
    
    var t = null
    println(t.toString())
}

看一下isNulOrEmpty函数的实现:

@kotlin.internal.InlineOnly
public inline fun CharSequence?.isNullOrEmpty(): Boolean {
    
    
    contract {
    
    
        returns(false) implies (this@isNullOrEmpty != null)
    }

    return this == null || this.length == 0
}

可以看到,当被调用对象是NULL时它返回true。并且返回类型Boolean是一个非空对象,所以isNullOrEmpty函数无论如何要么返回true要么返回false不可能是NULL。

猜你喜欢

转载自blog.csdn.net/devnn/article/details/122437364
今日推荐