lateinit和by lazy简单使用

Android  Kotlin  2024年9月10日 am8:57发布4周前更新 91es.com站长
37 0 0

前言

记录一下Kotlinlateinitby lazy简单使用。

正文

lateinit

为延迟初始化属性。

lateinit用于延迟初始化一个var可变属性。属性类型必须是非空的且不能是原始类型(如 Int, Double)。

经常在类中定义属性时

class Person{
    var name:String;
}

上面会提示

Property must be initialized or be abstract

解决这个可以如下方式

//初始化默认值
var nameA:String = "";

//把Person进行抽象(这肯定不是想要的)
abstract class Person{
   abstract var nameA:String;
}

当然,如果上面两个都不想,那就使用今天的主角lateinit。

使用场景
  1. 需要在构造方法之后初始化的可变属性。

  2. 需要在某个特定操作时才对属性进行赋值。

by lazy

为惰性初始化。

by lazy是一种委托属性,用于延迟初始化一个只读属性。属性在第一次访问时才会被初始化,并且初始化操作只会执行一次。

val property: Type by lazy { initializer }

延迟加载也是委托的一种形式。

val lazyTxt: String by lazy {
    Log.i(TAG,"初始化lazyTxt")
    "lazy"
}
 
Log.d(TAG, " 1 : $lazyTxt")
Log.d(TAG, " 2 : $lazyTxt")

日志打印

初始化lazyTxt
1 : lazy
2 : lazy

只初始化了一次。

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

使用场景
  1. 需要惰性初始化不可变的属性。

  2. 需要线程安全的初始化或者只在单线程中操作。

小结

特性 by lazy lateinit
适用类型 val(只读属性) var(可变属性)
初始化时间 第一次访问时 必须手动初始化
线程安全 默认线程安全 非线程安全
Nullability 支持不可空类型 支持不可空类型
属性检查 不需要显式检查 通过isInitialized检查
自定义 getter/setter 不支持 不支持
使用场景 用于只读且惰性初始化的属性 用于需要在构造函数之外初始化的可变属性

总结来说,选择使用 by lazy 还是 lateinit 要依据属性的特性和具体的使用场景。

by lazy 更适合不可变的延迟初始化场合,而 lateinit 则适用于在构造方法之后需要手动初始化的可变属性。

参考文章

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

  2. Kotlin之 lateinit 和 by lazy

  3. Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?

 历史上的今天

  1. 2023: OkHttp简单介绍之一(0条评论)
  2. 2022: ViewPager2事件冲突问题(0条评论)
  3. 2021: 对Matrix.mapRect()的理解(0条评论)
  4. 2019: 从维熙:夜空中的木拐(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

周国平:爱的距离

好的爱情有韧性,拉得开,但又扯不断。相爱者互不束缚对方,是他们对爱情有信心的表现。谁也不限制谁,到头来仍然是谁也离不开谁,这才是真爱。要亲密,但不要无间。人与人之间必须有一定的距离,相爱的人也不例外。婚姻之所以容易终成悲剧,就因为它在客观上使得这个必要的距离难以保持。一旦没有了距离,分寸感便丧失。...

Android异常之应用已停止运行的日志分析

文章之前写过,重新整理一下。为什么会有应用已停止运行?运行时出现了未捕获的异常,导致程序无法正常运行。如下面,主线程(main)出现致命异常(fatal exception)导致程序无法正常运行。 # main主线程,fatal exception 致命异常 AndroidRuntime...

徐志摩:再别康桥

再别康桥轻轻的我走了,正如我轻轻的来;我轻轻的招手,作别西天的云彩。 那河畔的金柳,是夕阳中的新娘;波光里的艳影,在我的心头荡漾。 软泥上的青荇,油油的在水底招摇;在康河的柔波里,我甘心做一条水草! 那榆荫下的一潭,不是清泉,是天上虹...

[摘]为什么要读书?

在当下这个信息爆炸令人眼花缭乱的时代,很多人都会有个疑问我读过很多书,但后来大部分都忘记了,你说这样的阅读究竟有什么意义?“当我还是个孩子时我吃了很多食物,大部分已经一去不复返而且被我忘掉了,但可以肯定的是,它们中的一部分已经长成我的骨头和肉。阅读对你的思想的改变也是如此。” 说的多好啊,是这样的...

新建工程,导入旧的module,出现Android Studio duplicate entry xx.class

前言这个是导入SystemUI时出现的,记录一下,方便自己查阅。好记性不如烂笔头正文导入旧的module后出现:Cause: duplicate entry: androidx/core/R$attr.class更多日志Execution failed for task ':Sys...

Instrumentation的简单记录

前言Instrumentation本身是Android用来做测试的工具,可以通过它监测系统与应用程序之间的交互。本文就介绍Instrumentation在应用中的简单使用。正文模拟事件需要权限<uses-permission android:name="android.permis...