当前位置: 首页 > news >正文

Kotlin 判空写法对比与最佳实践

在业务代码中,我们经常遇到可空对象的判空与处理。以下通过 updateRobotStatusResponse 的示例,总结三种推荐写法、优缺点对比以及团队实践建议。

写法一:let 操作符(推荐)


fun updateRobotStatusResponse(response: RobotStatusResponse?) {response?.let { resp ->if (resp.isSuccess()) {// 成功处理_robotStatusResponse.postValue(resp)Log.d(TAG, "机器人状态响应更新成功")} else {// 失败处理Log.e(TAG, "新系统机器人状态获取失败: ${resp.errorMessage}")}} ?: run {// response 为 null 的处理Log.e(TAG, "新系统机器人状态获取失败: response为null")}
}

优点

  • 空安全:只在非空时执行逻辑。

  • 作用域清晰:resp 在块内非空。

  • Kotlin 风格统一,简洁易懂。

适用场景:逻辑不复杂,需要兼顾可读性和简洁性的情况。

写法二:先判断 null(守卫式)

fun updateRobotStatusResponse(response: RobotStatusResponse?) {
if (response == null) {
Log.e(TAG, "新系统机器人状态获取失败: response为null")
return
}if (response.isSuccess()) {
_robotStatusResponse.postValue(response)
Log.d(TAG, "机器人状态响应更新成功")
} else {
Log.e(TAG, "新系统机器人状态获取失败: ${response.errorMessage}")
}
}

优点

  • 直观,先处理边界条件。

  • 提前返回,减少嵌套层次。

  • 结构清晰,易维护。

适用场景:逻辑较复杂,判空后需要快速返回的场景。

写法三:Elvis 操作符

fun updateRobotStatusResponse(response: RobotStatusResponse?) {
if (response?.isSuccess() == true) {
_robotStatusResponse.postValue(response)
Log.d(TAG, "机器人状态响应更新成功")
} else {
val errorMsg = response?.errorMessage ?: "response为null"
Log.e(TAG, "新系统机器人状态获取失败: $errorMsg")
}
}

  • 简洁,一行处理多种情况。

  • 统一,失败分支集中在一起。

适用场景:简单逻辑,团队习惯“精简风格”时。

不推荐写法:when 过度使用

fun updateRobotStatusResponse(response: RobotStatusResponse?) {
when {
response == null -> Log.e(TAG, "新系统机器人状态获取失败: response为null")
response.isSuccess() -> {
_robotStatusResponse.postValue(response)
Log.d(TAG, "机器人状态响应更新成功")
}
else -> Log.e(TAG, "新系统机器人状态获取失败: ${response.errorMessage}")
}
}

问题

  • 结构冗余,信息增益小。

  • 容易演变为“全局开关”,不利于维护。

推荐结论

  • 优先let 写法 —— 简洁、空安全、Kotlin 风格。

  • 复杂逻辑:守卫式写法 —— 边界先行、可维护性更强。

  • 次选:Elvis 操作符 —— 适合简单快速场景。

  • 避免when 判空,除非确实存在三种以上复杂分支。

http://www.dtcms.com/a/457206.html

相关文章:

  • 如何在中国建设银行网站转账网站域名格式
  • OSI 七层模型
  • HTTP Client
  • 网络彩票网站建设电商具体是做什么的上班
  • 【C语言基础详细版】02. 数组详解:从概念到应用全面解析
  • 告别项目文档滞后:Litho(deepwiki-rs)在CI/CD中的自动化文档生成实践
  • 接口测试-postman-全局变量与环境变量
  • 使用MockMVC进行Web请求验证
  • 淄博网站制作设计html5教程下载百度云
  • 专业网站建设怎么样网站建设的感想与建议
  • CMD命令行
  • MySQL————库的操作
  • Hugging face下载模型错误:401 Client Error: Unauthorized for url
  • 安装系统进阶专题(中)
  • 济南网站建设(力推聚搜网络)北京上地做网站
  • TortoiseSVN下载安装汉化教程(附安装包)
  • 泰安网站建设价格长治公司网站建设
  • (六)Vuex
  • 【代码】P6283 [USACO20OPEN] The Moo Particle S [思维]
  • linux信号(14)——SIGALRM:从“手机闹钟”看SIGALRM:进程的非阻塞定时神器
  • AJAX JSON 实例
  • 昆山做网站费用做精美得ppt网站知乎
  • 聊聊[自己制作手机 之 特别注意事项]
  • 量子通信:从“不可克隆”到“可证明安全”的信息传递新范式
  • 国内外主流的免费计算资源平台
  • XQuery 术语详解
  • 如何快速建一个网站网站内容建设的原则
  • AI 生态平台化加速
  • 【ThreeJs】【性能优化】从渲染底层到业务逻辑的系统性提速方案
  • C++ STL 向量(vector)学习笔记:从基础到实战