Kotlin中变量已指定有效值时是否需判空?冗余判空能否省略?
Kotlin空安全相关问题解答
问题1解答
如果变量已经是不可空类型(比如val x: String而非val x: String?),或者已经通过非空判断(比如if (x != null))让编译器智能识别为非空状态,那完全没必要额外加非空判断。Kotlin的空安全机制会跟踪变量状态,一旦确认非空,后续直接使用即可,重复判断属于冗余代码。
问题2解答
先指出代码里的一个逻辑错误:chargesVO.amount >= 0.toString()是把数值和字符串做比较,这不符合业务逻辑,应该改成和数值0对比,比如chargesVO.amount >= 0。
回到核心问题:不能直接删掉每个分支里的chargesVO != null,但可以通过重构代码避免重复判断,让逻辑更简洁。
优化后的代码示例
@BindingAdapter("binding:returnChargesLabel") @JvmStatic fun setReturnChargesLabel(textView: TextView, chargesVO: ReturnSummaryChargesVO?) { textView.isVisible = chargesVO != null chargesVO?.let { vo -> textView.text = if (vo.amount >= 0) vo.label else "0" } }
或者用when的简洁写法:
@BindingAdapter("binding:returnChargesLabel") @JvmStatic fun setReturnChargesLabel(textView: TextView, chargesVO: ReturnSummaryChargesVO?) { textView.isVisible = chargesVO != null when (chargesVO) { null -> {} // null状态已通过isVisible处理,无需额外操作 else -> textView.text = if (chargesVO.amount >= 0) chargesVO.label else "0" } }
为什么原代码不能直接删掉chargesVO != null?因为chargesVO是可空类型(ReturnSummaryChargesVO?),直接访问chargesVO.amount会触发编译器报错——它无法确认你调用的不是null对象的属性。只有先通过非空判断、?.安全调用或let作用域函数让编译器确认变量非空,才能安全访问amount属性。
原代码的冗余点
原when的两个分支都重复判断chargesVO != null,其实只需要统一处理一次非空逻辑,就能消除冗余,同时保证空安全。
内容的提问来源于stack exchange,提问作者Manuel AS
相关产品推荐
相关产品推荐

