在Kotlin中如何将全局可空变量作为非空使用且避免!!操作符
Kotlin全局可空逻辑非空变量避免使用!!的实现方案
你原有写法需要加!!的核心原因是全局可变属性无法触发智能转换:编译器无法保证你判空后到取值的间隙,该属性不会被其他线程修改为null,因此不允许直接将可空类型当做非空类型使用。
以下是几种不需要使用!!的等价实现方案:
方案1:使用Elvis运算符(最简洁)
直接通过Elvis运算符?:一次性完成空判断、取值、异常抛出逻辑,和你原有写法逻辑完全等价:
val functionalValue = global.technicalValue ?: throw SomeException()
当global.technicalValue非空时直接取自身值赋值,为null时直接抛出指定异常,全程不需要额外的空判断操作符。
方案2:缓存到局部变量触发智能转换
如果你需要在判空后增加额外的处理逻辑,可以先将全局属性的值拷贝到局部不可变变量,此时编译器可以确认该变量不会被其他线程修改,判空后会自动触发智能转换:
val temp = global.technicalValue val functionalValue = if (temp != null) { // 此处temp已被智能转换为非空类型,无需加!! // 可在此处添加自定义处理逻辑 temp } else { throw SomeException() }
方案3:封装非空扩展属性(适合高频复用场景)
如果你在多处代码中都需要将该属性作为非空值使用,可以把判空+抛异常的逻辑封装为扩展属性,后续所有调用处都不需要重复处理空逻辑:
// 替换GlobalClass为global变量的实际类型,替换TechnicalType为technicalValue的实际类型 val GlobalClass.technicalValueNonNull: TechnicalType get() = technicalValue ?: throw SomeException() // 调用处直接取值即可 val functionalValue = global.technicalValueNonNull
内容的提问来源于stack exchange,提问作者jactor-rises
相关产品推荐
相关产品推荐

