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

 一 注意属性与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需要注意这些

猜你喜欢

转载自blog.csdn.net/mp624183768/article/details/123876258