技術學習記錄

[Android]Kotlin學習筆記#5-lateinit跟lazy

由於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)
}

以上是延遲初始化的筆記,大致上是這樣。

之後如果有其他心得會再繼續補充。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *