有没有经历过这样的绝望时刻?💥
• 写代码时对象像约会迟到,总在需要它的时候不见踪影
• 想先声明变量后面再赋值,却被编译器疯狂报错追杀
• 每次初始化都要写一堆判空逻辑,代码肿得像泡发的馒头
Kotlin
早就看穿了这一切,于是掏出了两把金钥匙:lateinit和by lazy。这哥俩一个像会赊账的便利店老板,一个像精打细算的存钱罐,专治各种初始化不服。接下来就带你看透它们的套路,保准你学完直拍大腿:"早该用这招了!"
lateinit(先欠着型)
这玩意儿咋用?
必看说明书
• 只能欠对象
:比如String、View这些大件,不能欠Int这种小东西(系统不让你欠5块钱)
• 必须还债
:用之前不初始化?直接闪退报错!就像吃饭不给钱会被老板抓住
• 查岗功能
:可以用::我的按钮.isInitialized看看有没有装好按钮
什么时候用?
• Android里绑定控件(页面没加载完时按钮确实不存在)
• 测试的时候临时造数据
• 重点:你100%确定后面会填坑的情况!
by lazy(拖延症型)
典型用法
核心卖点
• 自动拖延
:不叫你就不动(省电模式)
• 只干一次活
:第一次干活后就把结果存起来(老油条行为)
• 啥都能拖
:基本类型、对象、可空类型通吃
• 安全模式
:默认不怕多线程抢着用(当然也能调成单身狗模式)
适用场景
• 加载大文件(比如游戏资源)
• 网络请求配置
• 需要复杂计算的数据
• 所有能拖到最后一刻干的事
对照表(饭圈版)
lateinit | by lazy | |
性格 | 急性子(必须手动给) | 懒癌晚期(自动拖延) |
户口 | 必须是var(能改嫁) | 必须是val(从一而终) |
安全 | 容易翻车(忘初始化就完蛋) | 自带安全气囊(默认线程安全) |
特长 | 适合动态变化的东西 | 适合一成不变的老古董 |
选择困难症急救包
选lateinit:
• 东西需要变来变去(比如动态更换按钮)
• 你能控制什么时候填坑(比如在onCreate里)
• 不能用val的情况(比如要重新绑定控件)
选by lazy:
• 东西生下来就定型(比如APP配置)
• 初始化很费劲(比如要读大文件)
• 想自动防呆(防止重复初始化)
防呆小贴士
lateinit翻车现场:
by lazy保命技巧:
终极总结
• lateinit
= 先画个饼,记得后面烙熟!(适合会变的东西)
• by lazy
= 打死不早做准备,但保证随叫随到!(适合不变的东西)
记住这两招,Kotlin写代码能省一半力气!用的时候悠着点,别把饼画太大最后烙不熟就行~