kotlin 什么情况下针对可空对象,可以不使用空安全调用(?.)

在看kotlin exposed源码时,看到如下语句:

fun <T> transaction(db: Database? = null, statement: Transaction.() -> T): T =
    transaction(db.transactionManager.defaultIsolationLevel, db.transactionManager.defaultRepetitionAttempts, db, statement)

发现函数参数db是可空的,在调用db.transactionManager时,竟然没有使用空安全操作符?.或者!!.来调用,经过一番研究,发现是因为transactionManager是Database的一个扩展属性,在此定义:

val Database?.transactionManager: TransactionManager
    get() = TransactionManager.managerFor(this) ?: throw RuntimeException("database $this don't have any transaction manager")

这样定义之后,就可以不使用?.或者!!.来访问该属性了,自己测了一下,确实如此:

class Test01 (var name: String){
//    val name = "tom"
    fun action(){
        println("do something in Test01, name is $name")
    }
}

val Test01?.age: Int
    get() = 30

fun Test01.actionOutside(){
    println("do something outside, name is $name")
}


fun main(){
    var test01 = Test01("tom")
    test01.action()
    test01.actionOutside()
    hello()
}

fun hello(obj1: Test01? = null){
    println(obj1.age)
}

总结:

所谓的扩展 属性,扩展函数,看上去好像是在已经定义的类上增加了一个函数或者属性,实际上就是在外部定义了一个函数和属性。新定义函数之所以可以访问类中成员变量,是因为该扩展函数转成java函数之后,将该类的对象作为该函数的一个参数了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值