Android第一行代码——快速入门 Kotlin 编程(4.8 Kotlin课堂:延迟初始化和密封类)

目录

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

4.8.1        对变量延迟初始化

4.8.2        使用密封类优化代码

4.9        小结与点评


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

        结束了干货满满的一整章,现在又来到最受期待的 Kotlin 课堂了。我之前说过,每章的 Kotlin 课堂都会结合当前章节的内容来拓展出 Kotlin 更多的使用技巧,那么本章可以拓展哪些知识点呢? 这里我已经帮你安排好了,本节的 Kotlin 课堂,我们就来学习延迟初始化和密封类这两部分内容。

4.8.1        对变量延迟初始化

        前面我们已经学习了 Kotlin 语言的许多特性,包括变量不可变,变量不可为空,等等。这些特性都是为了尽可能地保证程序安全而设计的,但是有些时候这些特性也会在编码时给我们带来不 少的麻烦。

        比如,如果你的类中存在很多全局变量实例,为了保证它们能够满足 Kotlin 的空指针检查语法标准,你不得不做许多的非空判断保护才行,即使你非常确定它们不会为空。

        下面我们通过一个具体的例子来看一下吧,就使用刚刚的 UIBestPractice 项目来作为例子。如果你仔细观察 MainActivity 中的代码,会发现这里适配器的写法略微有点特殊:

class MainActivity : AppCompatActivity(),View.OnClickListener{

    ...

    private var adapter:MsgAdapter? = null


    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        adapter = MsgAdapter(msgList) 
        ...
    }

    override fun onClick(v: View?) {
         ...
         adapter?.notifyItemInserted(msgList.size - 1) 
         ...
       }
    }

        这里我们将 adapter 设置为了全局变量,但是它的初始化工作是在 onCreate() 方法中进行 的,因此不得不先将 adapter 赋值为 null,同时把它的类型声明成 MsgAdapter?

        虽然我们会在 onCreate() 方法中对 adapter 进行初始化,同时能确保 onClick() 方法必然在 onCreate() 方法之后才会调用,但是我们在 onClick() 方法中调用 adapter 的任何方法时仍然要进行判空处理才行,否则编译肯定无法通过。

        而当你的代码中有了越来越多的全局变量实例时,这个问题就会变得越来越明显,到时候你 能必须编写大量额外的判空处理代码,只是为了满足 Kotlin 编译器的要求。

        幸运的是,这个问题其实是有解决办法的,而且非常简单,那就是对全局变量进行延迟初始 化。

        延迟初始化使用的是 lateinit 关键字,它可以告诉 Kotlin 编译器,我会在晚些时候对这个变量 进行初始化,这样就不用在一开始的时候将它赋值为 null 了。

        接下来我们就使用延迟初始化的方式对上述代码进行优化,如下所示:

class MainActivity : AppCompatActivity(),View.OnClickListener{

    ...

    // lateinit 关键字声明的变量必须在初始化时赋值,否则编译器会报错。
    private lateinit var adapter:MsgAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        adapter = MsgAdapter(msgList) 
   
  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值