1、对变量延迟初始化
当代码中出现越来越多的全局变量实例时,需要大量的判空处理代码,否则编译无法通过,对于这个问题的解决办法时对全局变量进行延迟初始化。延迟初始化用关键字lateinit,使用延迟初始化就不需要在一开始的时候将它赋值为null了,例如之前的适配器代码,在adapter变量的前面加上lateinit关键字,这样在一开始的时候就不需要赋值null,同时因为ChatAdapter是不可为空的类型,所以在onclick()方法中也就不需要进行判空处理,直接调用adapter的任何方法就可以。
class ChatActivity:AppCompatActivity(),View.OnClickListener{
private val msgList=ArrayList<MsgDatas>()
// private var adaper:ChatAdapter?=null
private lateinit var adaper:ChatAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.chat_layout)
initData()
btnsend.setOnClickListener(this)
...
adaper =ChatAdapter(msgList)
}
override fun onClick(v: View?) {
when(v){
btnsend ->{
.....
// adaper?.notifyItemInserted(msgList.size-1)
adaper.notifyItemInserted(msgList.size-1)
....
}
}
}
}
需要注意的是,在使用关键字lateinit的时候一定要确保在调用之前就完成了初始化公众,否则kotlin无法保证程序的安全性,另外,我们也可以通过代码来判断一个全局变量是否已经完成了初始化,这样就能避免重复对一个变量进行初始化操作,::daper.isInitialized用于判断adapter变量是否已经初始化
class ChatActivity:AppCompatActivity(),View.OnClickListener{
private val msgList=ArrayList<MsgDatas>()
// private var adaper:ChatAdapter?=null
private lateinit var adaper:ChatAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.chat_layout)
....
if(!::adaper.isInitialized){
adaper =ChatAdapter(msgList)
}
...
}
2、使用密封类优化代码
密封类的关键字sealed class,密封类是可继承类,代码如下:
sealed class Result {
class Success(val msg:String):Result()
class Failure(val error:String):Result()
}
调用的时候:
fun getResult(result: Result)=when(result){
is Result.Success ->result.msg
is Result.Failure ->result.error
}
网友评论