Kotlin里两个偷懒神器:lateinit和by lazy简单易懂解释

开发 开发工具
​​Kotlin​​早就看穿了这一切,于是掏出了两把金钥匙:lateinit和by lazy。这哥俩一个像会赊账的便利店老板,一个像精打细算的存钱罐,专治各种初始化不服。接下来就带你看透它们的套路,保准你学完直拍大腿:"早该用这招了!"

有没有经历过这样的绝望时刻?💥

• 写代码时对象像约会迟到,总在需要它的时候不见踪影

• 想先声明变量后面再赋值,却被编译器疯狂报错追杀

• 每次初始化都要写一堆判空逻辑,代码肿得像泡发的馒头

Kotlin早就看穿了这一切,于是掏出了两把金钥匙:lateinitby lazy。这哥俩一个像会赊账的便利店老板,一个像精打细算的存钱罐,专治各种初始化不服。接下来就带你看透它们的套路,保准你学完直拍大腿:"早该用这招了!"

lateinit(先欠着型)

这玩意儿咋用?

// 声明个按钮但先不装(就像网购下单但没付款)
lateinit var 我的按钮: Button

// 等页面加载好了再装按钮(确认收货)
override fun onCreate(...) {
   我的按钮 = findViewById(R.id.按钮)
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

必看说明书

• 只能欠对象:比如String、View这些大件,不能欠Int这种小东西(系统不让你欠5块钱)

• 必须还债:用之前不初始化?直接闪退报错!就像吃饭不给钱会被老板抓住

• 查岗功能:可以用::我的按钮.isInitialized看看有没有装好按钮

什么时候用?

• Android里绑定控件(页面没加载完时按钮确实不存在)

• 测试的时候临时造数据

• 重点:你100%确定后面会填坑的情况!

by lazy(拖延症型)

典型用法

// 配置信息(等到有人要看了才去查档案)
val 用户配置 by lazy {
   println("正在翻档案柜...")
   loadConfig() // 假装这里要查数据库
}

// 第一次访问时才干活
println(用户配置) // 这里才会执行上面的代码
println(用户配置) // 直接拿上次的结果
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

核心卖点

• 自动拖延:不叫你就不动(省电模式)

• 只干一次活:第一次干活后就把结果存起来(老油条行为)

• 啥都能拖:基本类型、对象、可空类型通吃

• 安全模式:默认不怕多线程抢着用(当然也能调成单身狗模式)

适用场景

• 加载大文件(比如游戏资源)

• 网络请求配置

• 需要复杂计算的数据

• 所有能拖到最后一刻干的事

对照表(饭圈版)


lateinit

by lazy

性格

急性子(必须手动给)

懒癌晚期(自动拖延)

户口

必须是var(能改嫁)

必须是val(从一而终)

安全

容易翻车(忘初始化就完蛋)

自带安全气囊(默认线程安全)

特长

适合动态变化的东西

适合一成不变的老古董

选择困难症急救包

选lateinit:

• 东西需要变来变去(比如动态更换按钮)

• 你能控制什么时候填坑(比如在onCreate里)

• 不能用val的情况(比如要重新绑定控件)

选by lazy:

• 东西生下来就定型(比如APP配置)

• 初始化很费劲(比如要读大文件)

• 想自动防呆(防止重复初始化)

防呆小贴士

lateinit翻车现场:

lateinit var 还没准备好的数据: String  
fun 作死() { println(还没准备好的数据) } // 闪退!
  • 1.
  • 2.

by lazy保命技巧:

val 保命数据 by lazy(LazyThreadSafetyMode.NONE) {  
   // 单身狗模式(效率更高但只能单线程用)  
}
  • 1.
  • 2.
  • 3.

终极总结

• lateinit = 先画个饼,记得后面烙熟!(适合会变的东西)

• by lazy = 打死不早做准备,但保证随叫随到!(适合不变的东西)

记住这两招,Kotlin写代码能省一半力气!用的时候悠着点,别把饼画太大最后烙不熟就行~

责任编辑:武晓燕 来源: 沐雨花飞碟
相关推荐

2010-05-28 09:57:50

TortoiseSVN

2021-04-12 08:00:00

云存储数据数据中心

2009-08-12 16:37:22

C#变量类型转换

2013-08-08 09:50:30

2013-12-16 09:32:21

未来网络ICNSDN

2020-04-16 09:54:39

JavaScript前端技术

2020-05-13 16:54:05

JavaScript开发代码

2011-04-19 16:06:57

typedef

2022-06-17 09:46:51

Chrome 102Chrome浏览器

2020-11-13 07:16:09

线程互斥锁死循环

2012-05-04 11:12:24

云计算

2023-05-12 15:42:32

AWSSnapChangeCedar

2020-04-09 10:25:18

Java 开发者神器

2020-09-28 18:19:15

awkLinux

2022-05-31 09:01:13

GitHub工具安全

2009-07-16 10:39:00

SwingUtilit

2010-09-10 15:26:05

SOAP封装

2022-07-13 15:46:57

Python数据可视化代码片段

2009-11-25 09:55:13

SUSE安装firef

2019-01-07 13:34:16

Riverbed数字性能数字体验管理
点赞
收藏

51CTO技术栈公众号