延迟初始化和密封类
延迟初始化
关键字lateinit
private layeinit val adapter:MsgAdapter
这样就告诉编译器,这个变量待会再进行初始化,这样就免去了每个全局变量都要初始化为null的麻烦。
但是一旦用了没有初始化的变量就会出错,所有可以加一个if语句判断其是否有初始化
if(!::adapter.isInitialized)
{
...
}
::adapter. isInitialized,这个语法是用来判断是否已经初始化的。
密封类优化代码
密封类关键字sealed,加在类前。密封类,顾名思义,被密封的类,其子类是被保护的。
大部分应用场景在。使用when时,一般情况下除了可能出现的几种情况,还需要多写一个else,这样会导致若传进去的参数是Unknown的,系统会直接报错崩溃,但是并不会提示是这里的问题。
密封类就很好的解决了这个问题!
当when() 括号中的参数为密封类时,系统会强制检查该类有哪些子类,强制限定你将每一个子类的情况处理,这样就必不可能出现else的情况。
实际应用例子:优化MsgAdapter
sealed class MsgAdapter(val msgList:List<Msg>): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
inner class LeftViewHolder(view: View): RecyclerView.ViewHolder(view) {
val leftMsg :TextView = view.findViewById(R.id.leftMsg)
}
inner class RightViewHolder(view: View):RecyclerView.ViewHolder(view){
val rightMsg:TextView = view.findViewById(R.id.rightMsg)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val msg = msgList[position]
when(holder){
is LeftViewHolder -> holder.leftMsg.text = msg.content
is RightViewHolder -> holder.rightMsg.text = msg.content
}
}