[译]如何在你的Kotlin代码中移除所有的!!(非空断言)

文章介绍了Kotlin中处理空类型和避免使用非空断言的六种方法,如let函数、全局函数、Elvis操作符和requireNotNull。作者强调了使用val而非var,以及lateinit的正确使用。通过这些技巧,可以使代码更安全、可读性更强。
摘要由CSDN通过智能技术生成

3)使用let函数

这里有个Kotlin中很常见的编译时错误:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

令我恼火的是:我知道这个可变属性在空类型检查后不能被改变。很多开发人员通过以下方式快速修复它:

private var mPhotoUrl: String? = null

fun uploadClicked() {
if (mPhotoUrl != null) {
uploadPhoto(mPhotoUrl!!)
}
}

但是这里有个优雅解决办法,那就是使用 let函数

private var mPhotoUrl: String? = null

fun uploadClicked() {
mPhotoUrl?.let { uploadPhoto(it) }
}

4)创建全局的函数去处理更多复杂的case

let 函数是一个很好的简单检查空类型替代方式,但是可能会出现更多复杂的cases,例如:

if (mUserName != null && mPhotoUrl != null) {
uploadPhoto(mUserName!!, mPhotoUrl!!)
}

你可以使用两个let函数嵌套调用,但是那样可读性很差。在Kotlin中你可以全局访问函数,因此你可以轻松地创建你所需要的函数。类似如下方法:

ifNotNull(mUserName, mPhotoUrl) {
userName, photoUrl ->
uploadPhoto(userName, photoUrl)
}

这个函数定义代码:

fun <T1, T2> ifNotNull(value1: T1?, value2: T2?, bothNotNull: (T1, T2) -> (Unit)) {
if (value1 != null && value2 != null) {
bothNotNull(value1, value2)
}
}

5)使用Elvis操作符

Elvis操作符作用不错在于如果你有空类型情况出现,会有返回值的功能。比如以下代码:

fun getUserName(): String {
if (mUserName != null) {
return mUserName!!
} else {
return “Anonymous”
}
}

可以被替代如下代码:

fun getUserName(): String {
return mUserName ?: “Anonymous”
}

6)按照你自己的声明崩溃

尽管你知道类型是可空的,但是有些情况下你知道一些属性是不可能为空的。一旦为空了,你应该很容易知道这是一个bug.然而抛弃使用 !! 非空断言,系统就会给你抛出一个很难去debug的通用的常 KotlinNullPointerException。使用内置函数 requireNotNull 或者 checkNotNull 和一些附带的异常消息易于调试。类似如下代码:

uploadPhoto(intent.getStringExtra(“PHOTO_URL”)!!)

以上代码可以替代为:

uploadPhoto(requireNotNull(intent.getStringExtra(“PHOTO_URL”), { “Activity parameter ‘PHOTO_URL’ is missing” }))

总结

如果你按照这6个提示,你可以从你的Kotlin代码删除所有的 !! 非空断言。这样你的代码将更安全,更可调试,更清洁。

译者有话说

  • 1、我为什么要翻译这篇博客?
    我们知道Kotlin中一个非常好的特性就是空类型安全的特性,也就是极大程度上避免了像Java中的空指针问题。是不是表示我使用Kotlin就不会存在空指针了呢。可以这么说Kotlin空类型安全特性,对于会使用的人来说将会是非常方便和安全,对于不会使用的人来说(特别是一些初学者,包括还在用Java语言思想写Kotlin代码的人)空类型安全特性的代码会写得非常的ugly,例如译文中反面教材例子滥用 !!非空断言。可能不仅仅是代码丑陋的问题,还很容易带来KotlinNullPointException. 如果你还在滥用!!(非空断言)处理Kotlin中空类型的话,看完本篇博客不妨尝试一种优雅的方式去实现空类型安全
  • 2、核心点提炼以及使用中需要注意的问题
    第一对于尽量多的使用val替代var这个建议,我在之前博客中多次提到。它可以避免出现一些不必要错误以及很好支持函数式编程。
    第二就是关于使用lateinit的问题,需要特别补充一点,当你在使用lateinit的时候,一定要保证你使用的这个属性,必须要在它初始化之后使用。而且在开发中一个坑就是接收网络请求返回成功后的数据属性不要用lateinit的修饰,因为由于某种异常情况,你的网络请求失败,无法回调到成功callback中,此时你的属性没有被初始化,而代码执行到使用这个属性时候就会抛出上面所说的UninitializedPropertyAccessException异常。建议使用lateinit属性时,你非常清楚改属性初始化是在使用之前,比如一般在onCreate方法中初始化的一些属性就可以声明成lateinit.
  • 3、总结
    关于空类型安全问题,其实还有很多需要注意的点,后续会有专门专题博客来阐述Kotlin中空类型安全的问题。而这篇译文则是先认识一下,以及在实际开发中如何优雅实现空类型安全的特性。
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    欢迎关注Kotlin开发者联盟,这里有最新Kotlin技术文章,每周会不定期翻译一篇Kotlin国外技术文章。如果你也喜欢Kotlin,欢迎加入我们~~~

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

《设计思想解读开源框架》

第一章、 热修复设计

  • 第一节、 AOT/JIT & dexopt 与 dex2oat

  • 第二节、 热修复设计之 CLASS_ISPREVERIFIED 问题

  • 第三节、热修复设计之热修复原理

  • 第四节、Tinker 的集成与使用(自动补丁包生成)

    第二章、 插件化框架设计

  • 第一节、 Class 文件与 Dex 文件的结构解读

  • 第二节、 Android 资源加载机制详解

  • 第三节、 四大组件调用原理

  • 第四节、 so 文件加载机制

  • 第五节、 Android 系统服务实现原理

    第三章、 组件化框架设计

  • 第一节、阿里巴巴开源路由框——ARouter 原理分析

  • 第二节、APT 编译时期自动生成代码&动态类加载

  • 第三节、 Java SPI 机制

  • 第四节、 AOP&IOC

  • 第五节、 手写组件化架构

    第四章、图片加载框架

  • 第一节、图片加载框架选型

  • 第二节、Glide 原理分析

  • 第三节、手写图片加载框架实战

    第五章、网络访问框架设计

  • 第一节、网络通信必备基础

  • 第二节、OkHttp 源码解读

  • 第三节、Retrofit 源码解析

    第六章、 RXJava 响应式编程框架设计

  • 第一节、链式调用

  • 第二节、 扩展的观察者模式

  • 第三节、事件变换设计

  • 第四节、Scheduler 线程控制

    第七章、 IOC 架构设计

  • 第一节、 依赖注入与控制反转

  • 第二节、ButterKnife 原理上篇、中篇、下篇

  • 第三节、Dagger 架构设计核心解密

    第八章、 Android 架构组件 Jetpack

  • 第一节、 LiveData 原理

  • 第二节、 Navigation 如何解决 tabLayout 问题

  • 第三节、 ViewModel 如何感知 View 生命周期及内核原理

  • 第四节、 Room 架构方式方法

  • 第五节、 dataBinding 为什么能够支持 MVVM

  • 第六节、 WorkManager 内核揭秘

  • 第七节、 Lifecycles 生命周期


    本文包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

**

[外链图片转存中…(img-1hrrjH3a-1712306119475)]
本文包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
[外链图片转存中…(img-YDRNORt6-1712306119476)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值