Kotlin中这种空值校验的写法是否为良好编码风格,有更优方案吗?
关于Kotlin参数空校验写法的相关说明
现有写法的风格评估
你写的这种text ?: return的写法属于Kotlin社区广泛认可的良好编码风格:
- 属于典型的*快速失败(fail-fast)*实践,提前拦截非法空输入,避免后续逻辑出现空指针异常
- 代码简洁无嵌套,可读性高,执行完该行后Kotlin编译器会自动将
text智能推导为非空String类型,后续使用不需要额外判空 - 适用于入参为空时可以直接静默退出当前函数、不需要额外报错的场景
更优的场景化实现方案
针对不同的业务场景,还有更贴合语义的实现可选:
1. 入参为空属于异常调用场景,需要抛出明确错误
可以用Kotlin标准库提供的requireNotNull/checkNotNull函数,语义更明确,还支持自定义错误信息方便排查:
fun test(text: String?) { // require系列用于入参校验,空值时抛出IllegalArgumentException requireNotNull(text) { "入参text不能为null" } // 后续text自动识别为非空类型 }
如果是校验内部状态而非入参,可以用checkNotNull,空值时抛出IllegalStateException,语义区分更清晰。
2. 入参为空时需要返回默认值
如果函数有返回值,空输入场景需要返回默认值的话,可以直接结合Elvis表达式写在返回逻辑里:
fun getTextLength(text: String?): Int { return text?.length ?: 0 }
3. 仅对非空值执行指定逻辑
如果只有非空时需要执行一段逻辑,也可以用?.let写法,适合逻辑较短的场景:
fun test(text: String?) { text?.let { nonNullText -> // 基于非空的nonNullText执行逻辑 } }
注意如果有多个参数需要判空,嵌套let的可读性会大幅下降,这种情况更推荐用逐个?: return的写法。
内容的提问来源于stack exchange,提问作者Yuki N
相关产品推荐
相关产品推荐

