You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:41:02