首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin:关键字之lateinit

在Kotlin中定义变量或者属性都是需要初始化值的,并且其都是private的,但是有些时候对于变量或者属性只需要声明,但是不需要初始化,则kotlin提供了lateinit关键字来实现: class...,char,short ,int,long,float,double) 也许有人会问到为什么为什么不可以修饰原始数据类型 对于对象类型,Kotlin使用 null 值,以标记 lateinit 属性尚未初始化...新手来说,应该抛开 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

87820
您找到你想要的搜索结果了吗?
是的
没有找到

【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )

延迟初始化属性 lateinit I ....属性初始化执行时机 : 在主构造函数调用后 , 会按照类中的代码顺序从上到下执行属性初始化 init 初始化代码中的内容 ; IV . get / set 属性访问器 ---- 1 . get 方法...延迟初始化属性 lateinit ---- 1 ....属性不能有访问器 : lateinit 修饰的数据类型不能定义 getter setter 属性访问器 ; 报错 'lateinit' modifier is not allowed on properties...延迟初始化属性为空 : 如果在没有初始化属性值时 , 调用该 lateinit 延迟初始化属性 , 会抛出异常 ; 6 . lateinit 延迟初始化属性推荐示例 : class Student {

1.2K10

【Kotlin】类的初始化 ④ ( lateinit 延迟初始化 | ::属性名称.isInitialized 检查属性是否初始化 | lazy 惰性初始化 )

文章目录 一、lateinit 延迟初始化 ( ::属性名称.isInitialized 检查属性是否初始化 ) 二、lazy 惰性初始化 一、lateinit 延迟初始化 ( ::属性名称.isInitialized...检查属性是否初始化 ) ---- 在定义属性时 , 可以使用 lateinit 关键字 设置该属性的 延迟初始化 , 在 实例对象 创建时不进行初始化 , 在使用该属性之前对其进行初始化即可 ; 对于...lateinit 延迟初始化属性 , 在使用前可以执行 ::属性名称.isInitialized 检查 , 查看该属性是否进行了初始化操作 ; 代码示例 : class Hello{ lateinit...{initName()} fun initName(): String { println("初始化 name 属性") return "Tom" }...(1000) // 在调用 name 属性后, 才初始化 name 属性 println("name = ${hello.name}") } 执行结果 : 实例对象初始化完毕 初始化

1.2K10

【Kotlin】变量简介 ( 可空类型 | lateinit | 初始化判定 | 非空类型 | !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)

抽象属性变量 I . Kotlin 变量总结 ---- 初学 Kotlin , 对变量机制不清楚的同学们 , 看完这篇博客基本就对变量的定义使用有清晰的认识 ; 1 ....= null 赋空值 ; ③ 非空变量 ( 引用类型 ) 使用 lateinit 修饰 ; ④ 抽象属性变量不初始化 ; 2 . !! 与 ? 修饰符 : 仅对于 可空类型 有效 , ?...非空变量 初始化 延迟初始化 : 非空变量只能有下面两种操作 , 抽象属性变量情况特殊另作说明 ; ① 直接初始化 : 直接赋值一个非空初始值 , 非空变量不能赋值 null , 否则编译器会报错...; ② 延迟初始化 : 引用类型变量使用 lateinit 关键字修饰 , 延迟初始化时机 , 可以在使用前进行初始化 ; 但是如果使用前没有初始化 , 执行时会报错 ; class Student()...") }else{ println("name 属性没有进行初始化") } } 执行结果 : this::name.isInitialized = false name

2.4K20

Kotlin 究竟该不该用 lateinit

也有同学喜欢尽可能的用上它,把 lateinit 作为介于 nonnull nullable 之间的一个状态:对象构造时为 null,在某一个时刻被初始化后一直都是 nonnull,这样属性的不确定性便减少了...当调用 lateinit 变量时,它此时如果没有被初始化,就会抛出UninitializedPropertyAccessException;如果已经初始化了,则操作一定会执行。...典型的初始化阶段:Activity.onCreate(),自定义模块的 init(); 保证对象的调用都在初始化之后 属性无法用空实现代替。 这个策略看起来是没什么问题的,执行的也比较顺利。...此时 Activity 仍然会执行 onDestroy(),而 lateinit 属性没有被初始化。...对比 nullable 属性lateinit 属性会 crash,nullable 属性不会,且 lateinit 属性加了初始化判断的效果一致。这种场景下 nullable 属性表现的更好。

1.8K20

Kotlin中的延迟属性(lazy properties)

如果初始化委托的同步锁不是必需的,这样多个线程可以同时执行,那么将 LazyThreadSafetyMode.PUBLICATION 作为参数传递给 lazy() 函数。...延迟属性Lazy 与 lateinit 区别 以下是lateinit varby lazy { ... }委托属性之间的显著差异: lazy { ... }代表只能用于val属性,而lateinit...除了val之外,lateinit不能用于可空属性Java原语类型(这是因为null用于未初始化的值);所以如果你需要在类中存在的支持字段,请使用lateinit; lateinit var可以从对象被看到的任何地方被初始化...如果您希望以预先未知的方式从外部初始化属性,请使用lateinit。...延迟属性Lazy 与 lateinit 使用总结 lateinit用于外部初始化:当需要外部资料通过调用方法初始化您的值时。

3.4K30

从源码角度分析 Kotlin by lazy 的实现

其中,lazy() 是一个函数,可以接受一个 Lambda 表达式作为参数,第一次调用时会执行 Lambda 表达式,以后调用该属性会返回之前的结果。...Lazy 接口的 value 属性用于获取当前 Lazy 实例的延迟初始化值。一旦初始化后,它不得在此 Lazy 实例的剩余生命周期内更改。...但是,如果某个值已由另一个线程初始化,则将返回该值而不执行初始化。 总结 lateinit 修饰的变量也可以延迟初始化,但并不是不用初始化,它需要在生命周期流程中进行获取或者初始化。...lateinitby lazy的区别: lateinit 只能用于修饰变量 var,不能用于可空的属性 Java 的基本类型。 lateinit 可以在任何位置初始化并且可以初始化多次。...lazy 在第一次被调用时就被初始化,以后调用该属性会返回之前的结果。

1.4K30

教你五分钟实现Android超漂亮的刻度轮播控件实例教程

以上都是需要我们用画笔来绘制的,所以我们定义了以下几个画笔,为了避免在onDraw中频繁更改画笔属性,这里又对文字刻度定义了单独的画笔,目的是避免任何画笔属性的改变和在onDraw中改变属性导致绘制过于耗时...  除了基础的画笔对象,还需要一些画笔必要的属性,比如我们绘制一个刻度,需要知道刻度位置、大小间距。...我们在一个命名空间中定义了一个属性id后,就可以像使用layout_widthlayout_height那样从xml中向View传递属性了。.../** * 从xml设置的属性初始化参数 */ private fun resolveAttribute(context: Context, attrs: AttributeSet?...= ArrayList<Int () (start..end).forEach { result.add(it) } return result } } } companion object { fun

66631

Kotlin —  lateinit vs lazy

Kotlin属性初始化 如果不想在一开始就初始化一个属性,那么你可以使用下面两个关键字。 ① lateinit ② lazy lateinit lateinit的意思是后面再初始化。...通常情况下,声明为非null类型的属性必须先初始化。但是,这在有些时候不是很方便。 要处理这种情况,可以使用lateinit修饰符修饰属性。...b、属性的类型必须是非空的,并且不能是原始类型。 lazy lazy的意思是惰性初始化。...lazy()是一个函数,它接受一个lambda并返回一个lazy实例,它可以作为一个实现lazy属性的委托:get()的第一个调用执行传递给lazy()的lambda并记录结果,随后调用get()只返回记录的结果...① lateinit var 可以从任何你能看到对象的地方初始化。如果你想你的属性从外部被初始化,这时候可以使用lateinit。 ② lazy只能用于val属性,而lateinit只能应用于变量。

64730

Kotlin学习笔记(二)-程序结构(上 )

println(it) } println("The End") } 当调用第二种循环,如果如上想跳出循环,那么println("The End")这句并不会执行。...(这里标识的定义是随便写的,@A @ABC都可以) 成员方法成员变量 这部分比较简单直接举例子: class X class B { // lateinit var a:Int //错误 不能再原始类型中使用...var x1: X // lateinit val x2: //错误 不可以 val 类似final 定义后别虚初始化 val x2: X by lazy {...,当然我们也可以重写这两个方法 field这个属性(也叫Backing Field)只能在gettersetter才能访问到,更多详见理解Backing Field Kotlin建议val/var修饰的属性最好直接初始化或是在构造方法中初始化...,如果不可以就降级为局部变量** lateinit延时初始化,不可以修饰val,不可以修饰基本数据类型(因为基本数据类型有默认值),理智使用lateinit否则会空指针 by lazy{} 可以修饰val

59320

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

Kotlin中有两种延迟初始化的方式。一种是lateinit var,一种是by lazy。...*/ 也可以这么写: 表示我先不给一个初始值,编译期的时候也无需进行非空判断,后面我会找时机给他赋值 即late的作用为编译期在检查时不要因为属性变量未被初始化而报错 lateinit var datas...property datas has not been initialized lateinit使用限制: 只能用来修饰类属性,不能用来修饰局部变量, 只能用来修饰对象,不能用来修饰基本类型(因为基本类型的属性在类加载后的准备阶段都会被初始化为默认值...初始化"); "aaa" } Log.i(Tag,"lazyParm->"+lazyParm); 如上,先进行声明lazyParm属性,直到后面执行到Log操作用到了lazyParm...时再进行初始化 打印结果: lazyParm初始化 lazyParm->aaa by lazy使用限制: 要求属性声明为val,即不可变变量,在java中相当于被final修饰。

2.5K31

Kotlin 机制你都了解吗?

在某个类中,如果某些成员变量没办法在一开始就初始化,并且又不想使用可空类型(也就是带?的类型)。那么,可以使用 lateinit 或者 by lazy 来修饰它。...lateinit 只能用于修饰变量 var,不能用于可空的属性 Java 的基本类型。 lateinit 可以在任何位置初始化并且可以初始化多次。...可以使用 @JvmField @JvmStatic 类似于 Java 中调用静态属性和静态方法; 伴生对象可以扩展属性扩展方法。...首先伴生对象中的代码是在类加载时就会执行。init代码块中的方法会按顺序放在主构造函数中,主构造函数中原来的代码会在后面执行。 9. const val 有什么区别?...该val关键字还用于只读属性。但是 const 之间的主要区别在于 val,val 属性也可以在运行时进行初始化,即不可变变量。 10.

74530

Kotlin入门(22)适配器的简单优化

lateinit的意思是延迟初始化,它放在var或者val前面,表示被修饰的变量属于延迟初始化属性,即使没有初始化也仍然是非空的。...}     //ViewHolder中的属性使用关键字lateinit延迟初始化     inner class ViewHolder {         lateinit var ll_item:...var tv_desc: TextView     } } 以上的Kotlin代码总算有点模样了,虽然总体代码还不够精简,但是至少清晰明了,其中主要运用了Kotlin的以下三项技术: 1、构造函数初始化参数放在类定义的首行...lateinit,表示该属性为延迟初始化属性; 网格视图 在前面的列表视图一小节中,给出了Kotlin改写后的适配器类,通过关键字lateinit固然避免了麻烦的空校验,可是控件对象迟早要初始化的呀...}     //ViewHolder中的属性在构造时初始化     inner class ViewHolder(val view: View) {         val ll_item: LinearLayout

1.3K10
领券