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

584

被折叠的 条评论
为什么被折叠?



