延迟初始类

这个应用的前提:很多情况下,我们会先初始化一个类,但是因为没有给他赋值,就给他赋值为null。如:

1
private var adapter: MsgAdapter? = null

而在kotlin中,对于可能为空的变量,需要进行很多次非空判断,非空保护,即便你知道他不可能为空。以满足他的语法规则。

延迟初始化

然后这里提供一种方法:

1
private lateinit var adapter: MsgAdapter

lateinit这个关键字表明当前这个变量不会立刻初始化,而是会在后面的步骤中赋值。但是他也有一个问题,如果你在使用这个变量时,没有赋值,他会抛出没有初始化的异常UninitializedPropertyAccessException。解决这个问题的方法就是在给他初始化的时候加一个判断是否初始化。

1
2
3
if (!::adapter.isInitialized) {
adapter = MsgAdapter(msgList)
}

这是一个固定的语法规则,能判断是否完成初始化。

密封类

密封类的关键字是sealed class,使用它可以构建一个密封类。
使用场景:在kotlin中,当你使用when函数时,总是需要else判断条件的。有时候你已经把可以枚举的可能性都枚举完后任然需要else。通常我们的做法是抛出一个异常使其编译通过。
比如:

1
2
3
4
5
6
7
8
9
sealed class Result
class Success(val msg: String) : Result()
class Failure(val error: Exception) : Result()
···
fun getResultMsg(result: Result) = when (result) {
is Success -> result.msg
is Failure -> "Error is ${result.error.message}"
}
···

如果我们使用了密封类的话,我们就必须在这种when的情况下,把所有的条件枚举出来,不然会语法报错。他的作用就是减少了出错的可能性,同时这里也不用写else了。

内部类

区分:
内部类和嵌套类,简单点就是内部类可以作为一个类的内部成员,可以引用到外部类,也就是这个整体。但是嵌套类不可以。
默认不加inner就是嵌套类

类A在类B中的声明 在java中 在kotlin中
嵌套类(不存储外部类的引用) static class A class A
内部类(存储外部类的引用) class A inner class A