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

Posted 安果移不动

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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需要注意这些

以上是关于Kotlin 初始化陷阱。初始化注意事项的主要内容,如果未能解决你的问题,请参考以下文章

Go的50度灰:Golang新开发者要注意的陷阱和常见错误(转)

Kotlin的lateinit

Kotlin的lateinit

kotlin学习总结——类和对象继承接口和抽象类

Java 构造时成员初始化的陷阱

Kotlin !!操作员使用使代码不清晰