我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Kotlin比较与解释Lazy与Lateinit的用法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Kotlin比较与解释Lazy与Lateinit的用法

这里比较与解释 LazyLateinit 的用法。

Lateinit

有时变量的值在其声明的位置不可用。 一个例子是在 Activity 或 Fragment 中使用的 UI widget。 直到 onCreate 或 onCreateView 方法运行,在整个 Activity 中用于引用这些 widget 的变量才能被初始化。 本例中的 submitButton,下面的代码是如果我们不使用 lateinit 的情况:

class HomeFragment: Fragment() {
   // we will provide actual value later
   private var submitButton: Button? = null 
}

我们知道,一个变量必须被初始化。 一个标准的做法就是使这个变量可以为空,并用 null 初始化它。

但是,使用 nullable 类型的问题在于,无论何时在代码中使用 submitButton,都必须检查可空性。 例如:submitButton?.setOnClickListener { .. }。我们必须在 submitButton 后面加上问号。

这个时候,我们就可以使用 lateinit:

class HomeFragment: Fragment() {
    private lateinit var submitButton: Button // will initialize later
}

另外一个例子:

private lateinit var courseName: String
// demo function to get course name using the courseId
fun fetchCourseName(courseId: String) {
    courseName = courseRepository.getCourseName(courseId)
    // this is an example, you can add other suff according to your usecase
}

我们需要非常确定 lateinit 变量在访问它之前会被初始化,否则会报错:

UninitializedPropertyAccessException: lateinit property courseName has not been initialized

如果我们不确定这个 lateinit 变量是否为空,那么可以使用 isInitialized 添加一个检查来检查 lateinit 变量是否已初始化:

if(this::courseName.isInitialized) {
    // access courseName
} else {
    // some default value
}

何时使用 lateinit 初始化

  • 如果变量是可变的(mutable)并且可以在稍后阶段初始化。
  • 必须在使用变量之前对其进行初始化。
  • 使用 var 关键字。

Lazy

某些类的对象初始化非常繁重,并且花费了太多时间,从而导致整个类创建过程的延迟。

例如,假设我们有一个名为 HeavyClass 的类,并且我们需要该 HeavyClass 的对象在其他名为 SomeClass 的类中:

class SomeClass {
    private val heavyObject: HeavyClass = HeavyClass()
}

在这里,我们正在创建一个 heavy object,这将导致 SomeClass 的创建缓慢或延迟。 在某些情况下,我们可能不需要 HeavyClass 对象。 因此,在这种情况下,lazy 关键字起到作用:

class SomeClass {
     private val heavyObject: HeavyClass by lazy {
        HeavyClass()
    }  
}

现在,使用 Lazy 的好处是只有在调用对象时才会创建对象。

使用惰性的另一个好处是,一旦对象被初始化,调用时再次使用同一个对象。

比如:

class SomeClass {
    private val heavyObject: HeavyClass by lazy {
        println("Heavy Object initialised")
        HeavyClass()
    } 
    fun accessObject() {
        println(heavyObject)
    }
}
fun main(args: Array<String>) {
    val someClass = SomeClass()
    println("SomeClass initialised")
    someClass.accessObject()
    someClass.accessObject()
}

打印

SomeClass initialised 
Heavy Object initialised 
HeavyClass@2a84aee7 
HeavyClass@2a84aee7

何时使用 Lazy 初始化

  • 除非你调用它,否则变量不会被初始化。
  • 初始化变量一次; 然后在整个代码中使用相同的值。
  • 在 val 属性的情况下使用,即作为同一对象的只读属性将在整个程序中共享

到此这篇关于Kotlin比较与解释Lazy与Lateinit的用法的文章就介绍到这了,更多相关Kotlin Lazy Lateinit内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Kotlin比较与解释Lazy与Lateinit的用法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Kotlin比较与解释Lazy与Lateinit的用法

在使用kotlin开发中,因为各种原因,我们会经常需要使用到延迟加载的功能,目前kotlin的延迟加载主要有两种:lateinit和lazy,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
2023-02-23

Kotlin对象的懒加载方式by lazy 与 lateinit 异同详解

这篇文章主要为大家介绍了Kotlin对象的懒加载方式by lazy 与 lateinit 异同详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

比较并解释lenb函数与len函数的返回结果

lenb函数与len函数的返回结果比较与解释在Python中,我们经常使用len函数来获取字符串、列表、元组等容器的长度。然而,当涉及到中文字符时len函数可能会出现一些问题,因为中文字符在内存中占用的字节数并不是固定的。为了解决这个问题
比较并解释lenb函数与len函数的返回结果
2024-01-29

MySQL中的distinct与groupby比较使用方法

今天无意中听到有同事在讨论,distinct和groupby有什么区别,下面这篇文章主要给大家介绍了关于MySQL去重中distinct和groupby区别的相关资料,需要的朋友可以参考下
2023-03-10

MySQL中的distinct与group by比较使用方法

目录distinct的使用distinct用法distinct 多列去重group by的使用单列去重多列去重区别示例distinct和group by原理隐式排序先说大致的结论 :在语义相同,有索引的情况下:group by和 dist
2023-03-10

在Mybatis使用Integer与''进行比较的坑及解决

这篇文章主要介绍了在Mybatis使用Integer与''进行比较的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-13

C++ 成员函数详解:对象方法与函数指针的比较

成员函数和函数指针的区别:语法:对象方法使用点语法,函数指针使用解引用运算符。隐式参数:对象方法有 this 指针,函数指针没有。可访问性:对象方法只能访问对象内数据,函数指针可访问任何标识符。效率:对象方法通常比函数指针慢,因需查找 th
C++ 成员函数详解:对象方法与函数指针的比较
2024-04-30

对比和解释CSS框架与组件库的不同和用途

解析CSS框架和组件库的区别与作用在前端开发中,CSS(层叠样式表)是一种用于控制网页元素样式和布局的语言。随着Web应用的复杂度和需求的增加,开发者们通常需要借助框架或组件库来提高开发效率,并且保持代码的可维护性和可复用性。本文将对CS
对比和解释CSS框架与组件库的不同和用途
2024-01-16

在Mybatis使用Integer与''进行比较的坑如何解决

这篇文章主要介绍“在Mybatis使用Integer与进行比较的坑如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“在Mybatis使用Integer与进行比较的坑如何解决”文章能帮助大家解决问
2023-07-05

详解汇编语言各种指令的解释与用法

汇编语言是一种低级语言,与计算机硬件直接相关。它使用一系列的指令来表示计算机的操作。下面是一些常见的汇编指令及其解释与用法:1. MOV:将数据从一个位置复制到另一个位置。例如,MOV AX, BX表示将BX中的数据复制到AX寄存器中。2.
2023-08-17

比较操作系统中的用户级线程与内核级线程:优劣势大解析

用户级线程和内核级线程是两种不同的线程实现方式,各有优缺点。本文将比较这两种线程实现方式,并分析它们的优缺点。
比较操作系统中的用户级线程与内核级线程:优劣势大解析
2024-02-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录