Kotlin 初始化陷阱。初始化注意事项

本文探讨了Kotlin中的初始化顺序和常见陷阱,包括属性与`init`块的执行顺序,以及如何避免初始化过程中的潜在问题。通过示例代码和字节码分析,解释了为何在Kotlin中需要注意初始化顺序,以防止空指针异常和其他错误。强调了与Java等其他语言的区别,并提供了正确的初始化方法。

 一 注意属性与init中的调用顺序

class Player6() {

    init {
        val bloodBonus = blood.times(4)
    }
    val blood = 100;


}

fun main() {

}

像java的静态代码块。和成员变量的顺序是可以这样的

但是在kotlin中不行。因为Kotlin是根据代码顺序进行初始化的

编译成字节码就会是这样

 顺便证明了。init的执行地方是构造方法初始化后。。

可行的初始化为如此

class Player6() {
    val blood = 100;

    init {
        val bloodBonus = blood.times(4)
    }


}

fun main() {

}

反编译字节码如下

 陷阱二

class Player7() {
    val name: String
    private fun firstLetter() = name[0];

    init {
        println(firstLetter())
        name = "Jack";
    }


}

fun main() {
    Player7()
}

 这个没啥好说的有一看就看出来

陷阱3

class Player8(_name: String) {
    val palyerName: String = initPlayerName()
    val name: String = _name;
    private fun initPlayerName() = name;
}

fun main() {
    println(Player8("Jack").palyerName)
}

这个也很明显 

赋值的时候他本身就是null

 可以看字节码他是如何运行的

 先执行方法 执行的时候他是null。所以最终返回null

正确写法呢

class Player8(_name: String) {
    val name: String = _name;
    val palyerName: String = initPlayerName()
    private fun initPlayerName() = name;
}

fun main() {
    println(Player8("Jack").palyerName)
}

放在java上面就没有这样的问题。所以kotlin需要注意这些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安果移不动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值