如何通过KProperty1检查lateinit属性是否已初始化?
检查KProperty1属性是否已初始化的正确方式
当然可以不用捕获异常的方式来判断,针对lateinit属性,Kotlin提供了专门的isInitialized扩展属性来检查其是否完成初始化,这比捕获异常更精准、性能也更好。
具体实现
只需要先判断属性是否为KMutableProperty1(因为lateinit只能修饰可变属性var),并且是lateinit类型,然后调用isInitialized方法即可:
inline fun <reified T : Any> T.stringify() = T::class .memberProperties .filter { it.visibility == KVisibility.PUBLIC } .filter { prop -> // 针对lateinit可变属性做初始化检查 if (prop is KMutableProperty1<*, *> && prop.isLateinit) { prop.isInitialized(this) } else { // 非lateinit属性在Kotlin语法约束下,要么有默认值要么已初始化,无需额外检查 true } } .joinToString(", ") { "${it.name} = \"${it.get(this)}\"" } .let { "${T::class.simpleName}($it)" }
注意事项
isInitialized仅适用于lateinit修饰的var属性,对于val属性或者非lateinit的var属性不适用。- 非
lateinit的成员属性在Kotlin中会被语法约束强制初始化(要么有默认值,要么在构造函数/初始化块中完成初始化),所以不会出现访问时抛出未初始化异常的情况。 - 原来的捕获所有
Throwable的方式存在风险,可能会误判其他类型的异常(比如属性getter逻辑中抛出的业务异常),而isInitialized只会检查该lateinit属性本身的初始化状态,逻辑更精准。
内容的提问来源于stack exchange,提问作者Hett
相关产品推荐
相关产品推荐

