初始化
1.延迟初始化
使用lateinit关键字相当于做了一个约定:在用它之前负责初始化
只要无法确认lateinit变量是否完成初始化,可以执行isInitialized检查
1 | class Player { |
使用isInitialized检查是否初始化
1 | class Player { |
2.惰性初始化
延迟初始化并不是退后初始化的唯一方式,你也可以暂时不初始化某个变量,直到首次使用它,这个叫做惰性初始化
1 | class Player(_name: String) { |
3.初始化陷阱
3.1 初始化陷阱一
属性的初始化必须在初始化块之前 (Java无所谓)
1 | class Player() { |
3.2 初始化陷阱二
这段代码编译没有问题,因为编译器看到name属性已经在init块里初始化了,但代码一运行,就会抛出空指针异常,因为name属性还没有赋值,firstLetter函数就应用它了
1 | class Player() { |
3.3 初始化陷阱三
因为编译器看到所有属性都初始化了,所以代码编译没问题,但运行结果确是null。问题出在用initPlayerName函数初始化playerName时,name属性还未完成初始化
1 | class Player(_name: String) { |