Kotlin for android 学习笔记 1:关键字lateinit 延迟初始化

文章转自:https://blog.csdn.net/qq_25749749/article/details/109001465

在Kotlin中定义变量或者属性都是需要初始化值的,并且其都是private的,但是有些时候对于变量或者属性只需要声明,但是不需要初始化,则kotlin提供了lateinit关键字来实现:

class Student {
    
    lateinit var name: String
    var address :String = "北京"
    lateinit val sex :String 

    lateinit var age: Int
    lateinit var sorce : Double 

    var studentNumber1 :Int
    var studentNumber2 :Int = 0
}

在这里插入图片描述从上图可以看出编辑器所出现的错误可以总结出在使用lateinit是需要注意的事项:

lateinit 对应使用var来声明属性
lateinit 不可以修饰原始数据类型(byte,char,short ,int,long,float,double)

也许有人会问到为什么为什么不可以修饰原始数据类型

对于对象类型,Kotlin使用 null 值,以标记 lateinit 属性尚未初始化,并在访问该属性时引发适当的异常。
对于原始类型,没有这样的值,因此无法将属性标记为未初始化并提供的诊断信息lateinit 需要提供。 (我们可以尝试使用某种单独的标记,但是在通过反射初始化字段时不会更新该标记,这是 lateinit 的主要用例)。

因此,仅对象类型的属性支持 lateinit

但是

lateinit 是一个坑,对于新手来说还是一个不小的坑

在 Kotlin 代码中慎用 lateinit 属性

这位作者解释的很清楚了

对于 Kotlin 新手来说,应该抛开 Java 式的写法,牢记类属性的三种初始化方式:

主构造函数内定义属性,使用传入的参数初始化属性;
类体内定义属性,同时初始化;
类体内定义属性,init 块里初始化。

最后再提一下Kotlin lateinit 和 by lazy 的区别:
1.lazy{} 只能用在val类型, lateinit 只能用在var类型 如 :
val name: String by lazy { “sherlbon” }
lateinit var adapter: MyAdapter12

2.lateinit不能用在可空的属性上和java的基本类型上 如:
lateinit var age: Int //会报错1

3.lateinit可以在任何位置初始化并且可以初始化多次。而lazy在第一次被调用时就被初始化,想要被改变只能重新定义
4.lateinit 有支持(反向)域(Backing Fields)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值