# 1. lateinit懶加載
該從`Java`轉到`Kotlin`寫代碼的時候,會很容易犯的一個錯誤就是類似定義一個類的屬性:
```
var name: String
```
上面的定義毫無疑問是錯誤的。但是,我們期望在最終第一次使用的時候去初始化,那么可能像這樣定義:
```
var name: String? = null
```
但是,在后面調用的時候,如果后面要求為不可變類型的時候,就不能這樣調用,比如:
~~~
// 定義類的屬性
var tab_note_img: ImageView? = null
// 在初始化方法中進行初始化
tab_note_img = findViewById<ImageView>(R.id.tab_note_iv)
// 以下寫法會報錯
tab_note_img.isSelected = true
~~~

但是如果我們修改一下定義:
~~~
lateinit var tab_note_img: ImageView
~~~
就不會有這個問題。但是這個只是編譯器不檢查而已,實際上也不會自動賦值為`null`,這里如果粗心就很容易導致程序崩潰。所以這種延遲初始化方法不太推薦使用。
# 2. by lazy懶加載
區別于上面的懶加載,這種更受推薦,因為不會因為考慮不到而導致程序崩潰。這種加載方式也叫做惰性加載。
對于全局唯一的`ImageView`控件,直接使用懶加載如下:
~~~
val tab_note_img: ImageView by lazy { findViewById<ImageView>(R.id.tab_note_iv) }
~~~
這種方式可以將初始化的時機交給程序自己來決定,為一種懶漢式的方式進行加載。更加貼近我們的需求。
- Kotlin語言基礎
- Kotlin的簡介
- Kotlin的變量和常見數據類型
- Kotlin的區間
- Kotlin的位運算
- Kotlin的容器
- Kotlin類型檢查
- Kotlin的空值處理
- Kotlin的函數
- Kotlin的類
- Kotlin的委托
- Kotlin的延遲加載
- Kotlin的異常
- Kotlin的Lambda表達式
- Kotlin的高階函數
- Kotlin的標準庫中的高階函數
- Kotlin的泛型
- Kotlin的表達式
- Kotlin的解構
- Kotlin的運算符重載
- Kotlin語言中級
- Kotlin的擴展函數
- Kotlin的擴展屬性
- Kotlin的infix關鍵字
- Kotlin的DSL
- Kotlin的一些注解(和Java互調用)
- Kotlin的lateinit和by lazy
- Kotlin的反射
- Kotlin的匿名接口
- 安卓中的Kotlin
- 數據庫操作Room