Kotlin的关键字 lateinit 和 lazy

序、完善一下曾经的草稿。

Kotlin通常要求我们在定义属性后立即对起进行初始化,当我们不知道理想的初始值时,这样做似乎很奇怪,尤其是在生命周期驱动android属性的情况下。

lateinit

简介

lateinit,Kotlin提供的一个可以延迟初始化的方案。和类属性一起使用的时候,lateinit修饰符会阻止该属性在其类的对象构造时被初始化。

lateinit修饰的变量只有在初始化时才会分配内存,而不是在声明对象时。

在Kotlin中,所有变量都要有非空限制(Kotlin中是默认是空安全的,任何属性的声明都必须有初始化值)。所以在声明变量的时候有以下两种

变量支持可空“?”,才能设置为null

    var map: HashMap<String, Int>? = null

如果我们不做非空操作,则需要给变量初始化赋值(非空属性必须在定义的时候初始化)。

    var map: HashMap<String, Int> = HashMap()

例如在项目中的我们网络请求的数据data变量,首先不想在创建过程中对其初始化,并且我们确定在执行之前,一定会在我们项目的某个地方被赋值。可以使用lateinit。

    private lateinit var homeBannerDatas: ArrayList<HomeBanner>private lateinit var courseDatas: MutableList<CourseTypeBean>

PS:

1.lateinit只能修饰, 非kotlin基本类型的变量。

因为每当lateinit访问一个属性时,Kotlin 都会在后台为其提供一个空值,以指示该属性尚未初始化。原始类型不能是null,因此无法指示未初始化的属性。

2.只能用在var变量上

by lazy

是属性委托一种。它是属性懒加载的一种实现方式,在对属性使用时才对属性进行初始化,并且支持对属性初始化的操作时进行加锁,使属性的初始化在多线程环境下线程安全。lazy默认是线程安全的。

lazy本质上是创建一个应用,但仅在第一次使用或调用该属性时进行初始化。

         //延迟属性lazy//延迟属性lazy()是一个函数,接受一个Lambda表达式作为参数,返回一个lazy<T>实例的函数。//返回的实例可以作为实现延迟属性的委托//第一次调用get()会执行已经传递给lazy()的lambda表达式并记录结果,//后续调用get()只会返回记录的结果private val spPrefs: SharedPreferences by lazy {EduApp.context.getSharedPreferences(file_name, Context.MODE_PRIVATE)}

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

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

相关文章

《向量数据库指南》——向量数据库 有必要走向专业化吗?

向量数据库 有必要走向专业化吗? 向量数据库系统的诞生,来源于具体业务需求——想要高效处理海量的向量数据,就需要更细分、更专业的数据基础设施,为向量构建专门的数据库处理系统。 但这种路径是必须的吗? 从产品层面讲,如果传统数据库厂商不单独研发向量数据库,那么…

Postgresql中的C/C++混编(JIT)

1 Postgresql编译JIT 整体上看使用了GCC、G编译文件&#xff0c;最后用G汇总&#xff1a; GCC编译的三个.o文件llvmjit、llvmjit_deform、llvmjit_expr llvmjit.c -> llvmjit.o gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -…

Service和启动其他应用的功能和替换Fragment

Service后台奔溃 1.启动 Intent intent new Intent(this, SpotLightService.class);this.startService(intent); //这个普通启动会在低内存的时候被杀掉//普通的启动修改成前台启动this.startForegroundService(intent);2.修改SERVICE Overridepublic int onStartCommand(Int…

Unity布料系统Cloth

Unity布料系统Cloth 介绍布料系统Cloth(Unity组件)组件上的一些属性布料系统的使用布料约束Select面板Paint面板Gradient Tool面板 布料碰撞布料碰撞碰撞适用 介绍 布料系统我第一次用是做人物的裙摆自然飘动&#xff0c;当时我用的是UnityChan这个unity官方自带的插件做的裙摆…

javaee ssm框架项目整合thymeleaf2.0 更多thymeleaf标签用法 项目结构图

创建ssmthymeleaf项目 创建ssmthymeleaf项目参考此文 thymeleaf更多常用标签 <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><title>Title</title> …

【前端设计模式】之组合模式

引言 组合模式是一种在前端开发中非常有用的设计模式&#xff0c;它可以帮助我们构建可扩展和灵活的应用。本文将探讨组合模式的特性、几个前端应用代码示例&#xff0c;以及它的优缺点。 在前端开发中&#xff0c;我们经常需要处理复杂的层次结构和嵌套关系。这时候&#xf…

Docker服务更新与发现

一&#xff0c;docker-consul简介 这是一个基于分布式的服务发现和管理工具&#xff0c;它具有快速构建分布式框架&#xff0c;提供服务发现和服务治理等特点。同时consul还提供了可靠的保证&#xff0c;多数据中心和强大的API以满足高可用&#xff0c;分布式环境下的需求。 …

【ccf-csp题解】第7次csp认证-第二题-俄罗斯方块-简单碰撞检测算法

题目描述 思路讲解 本题的主要思路是实现一个draw函数&#xff0c;这个函数可以绘制每一个状态的画布。然后从第一个状态往后遍历&#xff0c;当绘制到某一个状态发生碰撞时&#xff0c;答案就是上一个状态的画布。 此处的状态x实际就是在原来的15*10画布上的第x行开始画我们…

C++实现可变参数的日志打印vprintf

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言代码示例参考链接前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对C++实现可变参数的日志打印做个简单的…

docker网络管理与资源控制

目录 一、docker网络管理 1、Docker 网络实现原理 2、查看容器的输出和日志信息docker logs 容器的ID/名称 3、Docker 的网络模式&#xff1a; 4、网络模式详解 4.1&#xff0e;host模式 4.2&#xff0e;container模式 4.3. none模式 4.4&#xff0e;bridge模式 4.5&a…

你必须知道的数据查询途径!!

在当今信息爆炸的时代&#xff0c;我们每天都会面临海量的数据和信息。如何在这些繁杂的信息中快速、准确地找到自己需要的内容&#xff0c;也是当代一个非常重要的技能。下面&#xff0c;我将介绍几种你必须知道的企业数据信息查找途径。 ​ 1. 搜索引擎 搜索引擎是我们日常中…

OpenCV5-图像几何变换

OpenCV5-图像几何变换 1.图像连接2.图像尺寸变换3.图像翻转变换4.图像仿射变换5.图像透视变换6.极坐标变换 1.图像连接 图像连接是指将相同高度或者宽度的图像连接在一起。 vconcat()函数用于实现图像或矩阵的上下连接&#xff1a;上下连接的矩阵应该具有相同的列数&#xff…

智安网络|边缘计算与分布式存储:数字化时代的新趋势

随着数字化时代的到来&#xff0c;数据的产生和存储需求呈现爆炸式增长&#xff0c;传统的集中式存储架构已经无法满足大规模数据存储和处理的需求。分布式存储系统应运而生&#xff0c;成为应对数据存储和处理挑战的解决方案。然而&#xff0c;技术的发展不会止步于此&#xf…

点云直通滤波(附python open3d 代码)

定义了一个名为pass_through的函数,用于根据指定的过滤值名称(filter_value_name)对点云数据进行过滤。函数接受四个参数:点云数据(pcd),最小限制(limit_min)和最大限制(limit_max)以及过滤值名称(filter_value_name)。 在函数内部,首先将点云数据转换为NumPy数…

基于SSM的医用物理学实验考核系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

算法题:柠檬水找零(典型的贪心算法问题)

这道题就是纯贪心算法题&#xff0c;遍历每个顾客&#xff0c;先把钱收了&#xff0c;如果是10块钱就判断手里头有没有5元用于找零&#xff1b;如果是20块钱&#xff0c;先判断是不是有10元5元&#xff0c;如果没有就再判断是否有3个5元。没有的话就直接返回 False。(完整题目附…

CSP模拟51联测13 B.狗

CSP模拟51联测13 B.狗 文章目录 CSP模拟51联测13 B.狗题目大意题目描述输入格式输出格式样例样例 1inputoutput 思路 题目大意 题目描述 小G养了很多狗。 小G一共有 n n n\times n nn 条狗&#xff0c;在一个矩阵上。小G想让狗狗交朋友&#xff0c;一条狗狗最多只能交一个…

vue2项目中使用element ui组件库的table,制作表格,改表格的背景颜色为透明的

el-table背景颜色变成透明_el-table背景透明_讲礼貌的博客-CSDN博客 之前是白色的&#xff0c;现在变透明了&#xff0c;背景颜色是蓝色

加密市场波动:地缘政治与美股走弱引发不确定性!

伴随着国庆假期的结束&#xff0c;多日波动率维持低位的加密市场也似乎开始苏醒。近期多次突破28000美元未果的比特币&#xff0c;于9日15:00开始从27800美元附近下跌&#xff0c;最低跌至27260美元&#xff0c;同期以太坊也至1550美元左右&#xff0c;创近半个月来新低。 Coin…

vue接入高德地图获取经纬度

&#x1f90d;step1:高德地图开放平台&#xff0c;根据指引注册成为高德开放平台开发者&#xff0c;并申请 web 平台&#xff08;JS API&#xff09;的 key 和安全密钥; &#x1f90d;step2:在html引入安全密钥&#xff08;获取经纬度用&#xff0c;不然会报错&#xff09; <…