Kotlin:关键字之lateinit

简介: Kotlin:关键字之lateinit

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
}

image.png从上图可以看出编辑器所出现的错误可以总结出在使用lateinit是需要注意的事项:


lateinit 对应使用var来声明属性

lateinit 不可以修饰原始数据类型(byte,char,short ,int,long,float,double)

1

2

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


对于对象类型,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)


目录
相关文章
|
10月前
|
Java API 调度
Kotlin 中的suspend 关键字
Kotlin 中的suspend 关键字
116 0
|
12天前
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
**Kotlin中的`by lazy`和`lateinit`都是延迟初始化技术。`by lazy`用于只读属性,线程安全,首次访问时初始化;`lateinit`用于可变属性,需手动初始化,非线程安全。`by lazy`支持线程安全模式选择,而`lateinit`适用于构造函数后初始化。选择依赖于属性特性和使用场景。**
33 5
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
|
9天前
|
SQL 安全 Java
Android经典面试题之Kotlin中object关键字实现的是什么类型的单例模式?原理是什么?怎么实现双重检验锁单例模式?
Kotlin 单例模式概览 在 Kotlin 中,`object` 关键字轻松实现单例,提供线程安全的“饿汉式”单例。例如: 要延迟初始化,可使用 `companion object` 和 `lazy` 委托: 对于参数化的线程安全单例,结合 `@Volatile` 和 `synchronized`
19 6
|
11月前
|
API Kotlin
Kotlin中扩展函数、infix关键字、apply函数和DSL的详解
Kotlin中扩展函数、infix关键字、apply函数和DSL的详解
95 0
|
11月前
|
Kotlin
Kotlin中接口、抽象类、泛型、out(协变)、in(逆变)、reified关键字的详解
Kotlin中接口、抽象类、泛型、out(协变)、in(逆变)、reified关键字的详解
73 0
|
11月前
|
Kotlin
Kotlin中继承、类型转换、Any超类、object关键字详解
Kotlin中继承、类型转换、Any超类、object关键字详解
107 0
|
11月前
|
Kotlin
Kotlin 中定义类、field关键字,主构造函数和次构造函数详解
Kotlin 中定义类、field关键字,主构造函数和次构造函数详解
129 0
|
9月前
|
存储 Java 编译器
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(下)
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(下)
44 0
|
9月前
|
Java Android开发 开发者
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(上)
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(上)
69 0
|
11月前
|
Java Kotlin
Kotlin 中初始化块、初始化的顺序、lateinit延迟初始化详解
Kotlin 中初始化块、初始化的顺序、lateinit延迟初始化详解
77 0