<本文學習郭神《第三行代碼》總結>
在項目開發過程中一般會寫很多全局變量,這些全局變量在代碼中會做很多判空保護,這樣就會是代碼編寫很繁瑣。比如
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()
}