前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅谈Kotlin(六):lateinit、by lazy 使用

浅谈Kotlin(六):lateinit、by lazy 使用

作者头像
听着music睡
发布2021-12-24 14:16:42
2.4K0
发布2021-12-24 14:16:42
举报
文章被收录于专栏:Android干货Android干货

Kotlin中有两种延迟初始化的方式。一种是lateinit var,一种是by lazy。

一、lateinit的使用

按Java的写法,此时即代表datas默认为null,但是因为Kotlin的非空机制,这里给出了两种选择,要不给一个初始值,要不增加lateInit修饰

则可以这么写:

表示初始即为null

代码语言:javascript
复制
var datas:ArrayList<String> ? =null

改写法需要在后面使用的时候进行非空判断:

代码语言:javascript
复制
datas?.size

否则编译不通过,提示:

代码语言:javascript
复制
Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type kotlin.collections.ArrayList<String>? /* = java.util.ArrayList<String>? */

也可以这么写:

表示我先不给一个初始值,编译期的时候也无需进行非空判断,后面我会找时机给他赋值

即late的作用为编译期在检查时不要因为属性变量未被初始化而报错

代码语言:javascript
复制
lateinit var datas:ArrayList<String>

当然若在使用该变量的时候仍未给赋值,则会报错

代码语言:javascript
复制
Caused by: kotlin.UninitializedPropertyAccessException: lateinit property datas has not been initialized

lateinit使用限制:

只能用来修饰类属性,不能用来修饰局部变量,

只能用来修饰对象,不能用来修饰基本类型(因为基本类型的属性在类加载后的准备阶段都会被初始化为默认值)。

二、by lazy的使用

用法即先不进行初始化操作,直到第一次使用的时候再进行初始化

代码语言:javascript
复制
 val lazyParm: String by lazy {
        Log.i(Tag,"lazyParm初始化");
        "aaa"
    }

 Log.i(Tag,"lazyParm->"+lazyParm);

如上,先进行声明lazyParm属性,直到后面执行到Log操作用到了lazyParm时再进行初始化

代码语言:javascript
复制
打印结果:
lazyParm初始化
lazyParm->aaa

by lazy使用限制:

要求属性声明为val,即不可变变量,在java中相当于被final修饰。

可以使用于类属性或者局部变量。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-12-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档