# 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
~~~
![](https://img.kancloud.cn/a6/2a/a62a8f36690ceb66e24deb8757e65d90_964x102.png)
但是如果我们修改一下定义:
~~~
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