由於Kotlin的Null Safety特性,宣告變數時一定要初始化,否則編譯器會報錯。
一般我們在宣告變數的時候會用下面三種方式:
var text1 = "text1" // 省略型別
var text2: String = "text2" // 不省略型別
var text3: String? = null // 型別為 String 且可為空
但有時候我並不想讓變數nullable,而且我也沒辦法讓他一開始就初始化。
這時候就可以用lateinit或lazy來做延遲初始化。
lateinit var
當要綁定一個UI元件到程式碼,且這個類別中的所有方法都要能夠使用他的時候,必須宣告一個類別內部的全域變數,如下:
class MainActivity : AppCompatActivity() {
private var textView: TextView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textView = findViewById(R.id.textView)
if(textView != null) {
textView.text = "我好帥"
}
}
}
但是這個textView物件是nullable的,如果忘記賦值的時候,會發生空值例外。
而且在對他進行操作的時候,必須先檢查是否為null,豈不是很麻煩?
因此Kotlin提供了lateinit這個修飾詞讓var可以延遲初始化,如此一來textView這個物件就不是再是可為空的變數了。
class MainActivity : AppCompatActivity() {
private lateinit var textView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textView = findViewById(R.id.textView)
textView.text = "我好帥"
}
}
但必須注意,使用延遲初始化宣告變數時一定要在使用前先將物件初始化。
否則可是會跳出”lateinit property has not been initialized”的錯誤訊息呢!
by lazy
前面提到了變數可以用lateinit var來宣告,使其可以延遲初始化。
那常數的部分,則是可以透過by lazy
這個語法來將常數變數延遲初始化。
使用by lazy方式初始化的常數物件,在第一次引用時,才會進行初始化。
private val text1 by lazy { "Text1" }
除此之外,lazy也能用在方法內的區域變數:
fun myFunction() {
val text by lazy { "text" }
println(text)
}
以上是延遲初始化的筆記,大致上是這樣。
之後如果有其他心得會再繼續補充。