Kotlin中lateinit 和 Lazy 的区别

news2025/1/11 17:43:23

Kotlin中Lateinit 和 Lazy 的区别

 Kotlin 中lateinit 和 lazy 有什么区别?

latinit

我们可能不想在定义它们时初始化我们的值,相反我们可能想在以后的任何时间初始化并在我们的应用程序中使用它们。但是在使用我们的值之前,一定要记住,我们的值必须先初始化,然后才能使用。让我们举个例子更好地理解!

class MainActivity : AppCompatActivity() {

    //Here is the value we don't want to initialize at declaration time,
    // so we used the lateinit keyword.
    private lateinit var myUser:User

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //We can initialize our value at any time in our application.
        myUser = User("Hüseyin","Özkoç")
        println("MY NAME IS : " + myUser.name)
    }
}

data class User(var name: String, var surname: String)

运行结果
正如我们在上面的例子中看到的,我们在识别它的时候并没有初始化我们的值。相反,我们在应用程序的 OnCreate() 函数中对其进行初始化,并使用 print() 方法将我们的值打印到 LogCat。如果我们尝试在不初始化的情况下将我们的值打印到 LogCat 会怎样?让我们试试看!

 //We can initialize our value at any time in our application.
        //myUser = User("Hüseyin","Özkoç")
        println("MY NAME IS : " + myUser.name)

在这里插入图片描述
如上所示,如果我们尝试在未初始化的情况下访问我们的值,我们将遇到UninitializedPropertyAccessException错误。我们也可以使用Kotlin 提供的isInitialized()方法来避免这个错误。

class MainActivity : AppCompatActivity() {
    //Here is the value we don't want to initialize at declaration time,
    //So we used the lateinit keyword.
    private lateinit var myUser: User

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        /**
        We can check if our value is initialize using isInitialized.
         */
        if (this::myUser.isInitialized) {
            println("MY NAME IS : " + myUser.name)
        } else {
            myUser = User("Hüseyin", "Özkoç")
            println("MY NAME IS : " + myUser.name)
        }
    }
}

data class User(var name: String, var surname: String)

使用by lazy

延迟初始化是我们在软件世界中经常遇到的一种设计模式。使用惰性初始化,我们只能在第一次访问对象时创建对象,否则我们不需要初始化它们。它确保创建成本高昂的对象仅在要使用它们的地方初始化,而不是在应用程序启动时初始化。

当我们想在一个类中创建一个对象时,Kotlin 中的 Lazy 非常有用,但是该对象的创建是昂贵的,并且可能导致创建依赖于该昂贵对象的对象的延迟。因此,我们需要明白,对象只有在第一次访问时才会被初始化,否则不会被初始化。

让我们举个例子更好地理解!

class MainActivity : AppCompatActivity() {
    //Here is the value we don't want to initialize at declaration time,
    //So we used the lateinit keyword.
    private lateinit var myButton: Button

    /**
     * Suppose we have this expensive object
     * that will initialize only when we need it.
     */
    private val myUser: User by lazy {
        print("Lazy initialization")
        User("Hüseyin", "Özkoç")
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        myButton = findViewById(R.id.myButton)

        myButton.setOnClickListener {

            /**
             * We want this object to be created only once
             * when the button is clicked, not inside the onCreate() method.
             * 
             *  Therefore, the moment we use our myUser value,
             *  our value will be initialized once and
             *  we will use that initialized value for all other clicks.
             */
            println(myUser.name)

        }

    }
}

data class User(var name: String, var surname: String)

logcat输出
正如我们在上面的例子中看到的,当我们试图访问我们的对象时,我们的值只被初始化一次,然后我们在每次点击时使用那个初始化的对象。

Lateinit 和 Lazy 有什么区别?

    1. lateinit仅限于可变(var)变量属性,而lazy修饰符仅用于只读(val)。
    1. 虽然标有lateinit的值可以在运行时多次赋值,但用lazy初始化的值只能在第一次使用时赋值一次。
    1. 虽然不可能将原始数据类型定义为lateinit值,但“惰性”值可以是原始数据类型或非原始数据类型。(如整数)
    1. 虽然无法确保lateinit值的线程安全,但我们可以为lazy值选择同步选项之一,例如 SYNCHRONIZED、PUBLICATION、NONE。(这就是我们在使用 Singleton 设计模式时使用 lazy 的原因。)
    1. lateinit值不能定义为nullable,但是“lazy”可以定义为nullablenon-nullable
    1. lateinit值不能有自定义的getter,而“lazy”值包含在第一次调用该值时运行的代码块。
    1. 尝试在初始化之前访问lateinit属性将导致错误,指出该值未初始化。另一方面,“惰性”值在初始化之前无法访问。重要的是要注意“惰性”属性可以为 null,但该值仍会在第一次访问时被初始化。

参考

https://kotlinlang.org/
https://amitshekhar.me/blog/lateinit-vs-lazy-in-kotlin
https://agrawalsuneet.github.io/blogs/lateinit-vs-lazy-property-in-kotlin/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430654.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高斯混合模型 GMM 的详细解释

高斯混合模型(后面本文中将使用他的缩写 GMM)听起来很复杂,其实他的工作原理和 KMeans 非常相似,你甚至可以认为它是 KMeans 的概率版本。 这种概率特征使 GMM 可以应用于 KMeans 无法解决的许多复杂问题。 因为KMeans的限制很多…

【factoryio】虚拟仓储实现(入仓出仓)

实现虚拟工厂场景之一的智能仓储实验 注:本文仅供参考 目录 引 入仓部分 1.上料部分 1.效果 2.实现 2.入仓部分 1.效果 2.实现 3.入仓扩展 1.行列控制和优先级 2.入仓优化和完善 出仓部分 1.出仓 2.后传送带 3.出仓效果 1.效果 2.优先级 3.完…

Linux时间服务器(ntp)

1.配置ntp时间服务器,确保客户端主机能和服务主机同步时间 2.配置ssh免密登陆,能够通过客户端主机通过redhat用户和服务端主机基于公钥验证方式进行远程连接 一.配置ntp时间服务器,确保客户端主机能和服务主机同步时间 1、软件安装 [rootl…

高速前行的低代码,其能力边界到底在哪?

最近半年,有好些来自不同岗位、不同立场的人开始问同一个问题:低代码平台的边界是什么?低代码无所不能吗? “全民开发”、“人人都是开发者”这样的口号愈演愈烈,“低代码能力有没有边界”、“边界在哪”,这…

数据要素化全面提速,数据复制将迎来春天?

数据复制市场将迎来真正的春天? 目前看的确如此。近日,国家发改委密集发文,从产权、分配、流通、安全等多个角度解读“数据二十条”( 《中共中央国务院关于构建数据基础制度更好发挥数据要素作用的意见》,简称“数据二…

算法的时间复杂度和空间复杂度(1)

1.算法效率 2.时间复杂度 3.空间复杂度 1.算法效率 如何衡量一个算法的好坏&#xff1f; 比如对于以下斐波那契数列&#xff1a; long long Fib(int N) { if(N < 3) return 1; return Fib(N-1) Fib(N-2)&#xff1b; } 斐波那契数列的递归实现方式非常简洁&#xff0c;但…

SOFA Weekly|SOFA 开源五周年来自社区家人的祝福、社区本周贡献 issue 精选

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展欢迎留言互动&#xff5e;SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&#…

《程序员面试金典(第6版)》面试题 10.05. 稀疏数组搜索(二分法,分治算法入门题目,C++)

题目描述 稀疏数组搜索。有个排好序的字符串数组&#xff0c;其中散布着一些空字符串&#xff0c;编写一种方法&#xff0c;找出给定字符串的位置。 示例1: 输入: words [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”, “”,“dad”, “”, “”], s “t…

2023有哪些便宜好用的蓝牙耳机?性价比最高的无线耳机排行

不管入手什么东西&#xff0c;性价比永远能成为人们入手的最重要的参考要素之一。那么&#xff0c;在蓝牙耳机市场中&#xff0c;有哪些便宜好用的蓝牙耳机&#xff1f;针对这个问题&#xff0c;我来给大家推荐几款性价比最高的无线耳机&#xff0c;一起来看看吧。 一、南卡小音…

采购系统是如何管理供应商的?

随着数字化的推进&#xff0c;企业面临着越来越多的供应商管理问题。企业采购数字化转型已经成为大势所趋&#xff0c;对于采购数字化转型而言&#xff0c;供应商管理是重要一环。 供应商准入管理 在供应商准入阶段&#xff0c;企业需要从供应商资质、财务能力、信誉能力、管理…

vite 安装腾讯im组件TUIKit问题记录

按照vue3ts要求安装依赖包 即时通信 IM Web & H5-含 UI 集成方案&#xff08;荐&#xff09;-文档中心-腾讯云 (tencent.com) 这个版本的文档采用全局安装sass&#xff1a; npm install -g sass sass-loader10.1.1 实际安装后遇到无法解析sass的错误提示&#xff0c;使用…

JumpServer堡垒机部署+基本使用

文章目录JumpServer 堡垒机一、理论知识&#xff1a;1、堡垒机与跳板机的区别2、JumpServer4A认证二、实践实验:1、初始化环境准备2、MySQL数据库部署3、Python3.6 程序部署4、Redis数据库部署5、Core组件部署6、Koko组件部署7、Guacamole组件部署1、安装FFmpeg2、安装Guacamol…

socket 及 字节序转换(嵌入式学习)

socket 及 字节序转换socket简介Socket为什么需要Socket&#xff1f;socket类型Socket通信模型字节序主机字节序到网络字节序网络字节序到主机字节序IP地址转换socket简介 1、1982 - Berkeley Software Distributions 操作系统引入了socket作为本地进程之间通信的接口 2、1986…

SAP MDG —— 使用DIF导入物料主数据 Part2 配置和应用

文章目录关于使用DIF处理物料主数据的相关信息配置定义数据传输对象类型 Object Types文件源和存档目录Web Dynpro 应用导入选项MDG_BS_FILE_IMPORT 的选择项本章小结关于使用DIF处理物料主数据的相关信息 配置 定义数据传输对象类型 Object Types 路径&#xff1a; MDGIMG-…

读懂AUTOSAR :DiagnosticLogAndTrace DLT(四)-- API解析

一、周期调用的函数&#xff1a;Dlt_TxFunction 根据参数DltGeneralTrafficShapingSupport&#xff0c;决定如何去发送DLT消息。如果为TRUE&#xff0c;那需要参考参数DltLogChannelTrafficShapingBandwidth为每个Log通道设置发送带宽&#xff1b;如果为FALSE&#xff0c;那么…

《LKD3粗读笔记》(9)内核同步介绍

文章目录1、临界区和竞争条件2、 加锁3、死锁4、争用和扩展性实现内核同步的意义是什么&#xff1f; 目前内核支持SMP&#xff0c;所以共享资源一定要防止并发访问&#xff0c;如果多个执行线程同时访问和操作数据&#xff0c;就可能发生各线程之间相互覆盖共享数据情况&#x…

ABeam News | 松下家电(中国)生产销售一体化SAP S/4HANA项目正式启动

近日&#xff0c;由德硕管理咨询&#xff08;上海&#xff09;有限公司参与实施的松下家电&#xff08;中国&#xff09;生产销售一体化SAP S/4HANA项目正式上线&#xff0c;松下集团代表董事全球副总裁本间哲朗先生及ABeam大中华区董事长兼总经理中野洋辅先生出席了项目启动会…

【实验报告】实验二 图像空间域频率域滤波

一&#xff0e;实验目的&#xff1a; 1. 模板运算是空间域图象增强的方法&#xff0c;也叫模板卷积。 &#xff08;1&#xff09;平滑&#xff1a;平滑的目的是模糊和消除噪声。平滑是用低通滤波器来完成&#xff0c;在空域中全是正值。 &#xff08;2&#xff09;锐化&…

【超全总结】集成环信消息推送注意事项(华为、oppo、vivo等)

环信即时通讯 IM 支持集成第三方厂商的消息推送服务&#xff0c;为 Android 开发者提供低延时、高送达、高并发、不侵犯用户个人数据的离线消息推送服务。 当客户端应用进程被关闭等原因导致用户离线&#xff0c;环信即时通讯 IM 服务会通过第三方厂商的消息推送服务向该离线用…

鸿蒙Service Ability的前世今生--进阶篇

二、SA的配置 ​ SA的运行需要配合多个配置项&#xff0c;此节专门对此进行说明。 ​ OpenHarmony中SA一般由两个配置文件和一个so组成。上一章节已介绍了生成so中代码。此节描述下另外两个配置文件(.cfg或.rc、xml)。 ​ SA的启动一般采用.cfg或.rc .xml libxxx.z.so方式…