第一行代码-第三版4.8 kotlin课堂:延迟初始化和密封类

4.8 kotlin课堂 :延迟初始化和密封类

4.8.1 对变量延迟初始化

要解决的问题:全局变量的判空,在确保不为空的情况下,kotlin仍然可能需要你对这个变量进行判空操作。
解决问题的方法:对全局变量进行延迟初始化
延迟初始化使用的关键字是lateinit
只能用于var声明的值,毕竟是对变量进行延迟初始化。
存在未初始化就直接使用的风险,这样的情况会抛出UninitializedPropertyAccessException异常。
var x
可以使用语句:if(!::x.isInitialized) 来判断变量x是否进行了初始化。
上面的语句是固定写法。

使用密封类优化代码

使用场景:通常是结合RecyclerView适配器中的ViewHolder一起使用。

要解决的问题:为了满足编译器的要求而编写的无用条件分支的情况。如:在when()中必须写上else分支,即使它不会被执行。

import java.lang.Exception
import java.lang.IllegalArgumentException

interface 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 ->result.error.message
    else -> throw IllegalArgumentException()
}

解决问题的方法:sealed class 密封类
修改上面的代码:

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语句中传入一个密封类变量时,kotlin编译器会自动检查该密封类有哪些子类,并强制要求你将每一个子类所对应的条件全部处理。

注意:密封类及其所有子类只能定义在它同一文件的顶层位置,不能嵌套在其他类中。

书上有应用于RecyclerView的例子。
2020/4/16

你可能感兴趣的:(第一行代码-第三版:读书笔记)