Kotlin學習路(五):變量延遲初始化

<本文學習郭神《第三行代碼》總結>

在項目開發過程中一般會寫很多全局變量,這些全局變量在代碼中會做很多判空保護,這樣就會是代碼編寫很繁瑣。比如

var s : Second ?= null
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_login)
    s = Second()
    s ?. doHomework()
    s ?. doHome()
    s ?. doWork()
}

當有多個全局變量時,就會寫很多的判空保護。所以這裏就需要對全局變量進行延遲初始化操作,使用關鍵字lateinit,它會告訴編譯器,晚些時候對該變量進行初始化,在代碼中就不用進行判空保護。

所以上述代碼就可修改爲:

lateinit var s : Second
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_login)
    s = Second()
    s . doHomework()
    s . doHome()
    s . doWork()
}

可以看出,當加入lateinit關鍵字之後,就不用了做判空保護。

需要注意的是,如果在使用了lateinit關鍵字之後,調用全局變量時還未對該變量進行初始化,則會報錯,拋出異常UninitializedPropertyAccessExcepetion,所以當使用lateinit關鍵字時必須要在調用全局變量之前進行初始化操作。

在初始化操作時,爲避免重複初始化,可以進行初始化判斷,使用語法!::s.isInitialized進行初始化判斷。

所以上述代碼可以修改爲:

lateinit var s : Second
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_login)
    if (!::s.isInitialized)
        s = Second()
    s . doHomework()
    s . doHome()
    s . doWork()
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章