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

Kotlin全局单例User的userInfo属性赋值后仍为null如何解决

问题根因
  • 你定义的userInfo初始值为null,直接调用User.userInfo.name = "blabla"时,User.userInfo本身还没有对应实例,属于对空对象的属性赋值,操作无效且存在空指针风险。
  • 额外声明val user: User? = null完全多余:Kotlin中object关键字定义的类本身就是全局单例,直接通过类名User访问即可,你手动声明的这个变量主动赋值为null,调用它自然也不会得到单例实例。
修复方案
  1. 先初始化userInfo再修改属性
    在修改userInfo内部字段前,先给它赋值UserInfo实例:
// 先初始化
User.userInfo = UserInfo()
// 再修改属性,建议加安全调用符避免空指针
User.userInfo?.name = "blabla"
  1. 可选优化:避免可空类型校验
    如果你确定userInfo在使用时不会为空,可以直接声明为非空类型,提供默认实例,clear方法中重置为新的默认实例即可:
object User {
    // 直接初始化默认实例,不需要声明为可空
    var userInfo: UserInfo = UserInfo()
    var listOfVehicles: MutableList<Vehicle> = mutableListOf()

    fun clear(){
        // 重置为新的默认实例
        userInfo = UserInfo()
        listOfVehicles = mutableListOf()
    }
}

修改后可以直接调用User.userInfo.name = "blabla",不需要判空也不会出现赋值不生效的问题。
3. 额外检查:确保UserInfo类中的name属性声明为可修改的var,如果是val不可变类型也会导致赋值失败。

补充说明

你当前的单例结构本身是符合全局唯一要求的,Kotlin object定义的单例本身会全局持有唯一实例,支持所有Activity、Fragment等组件直接读写属性,不需要额外实例化操作。

内容的提问来源于stack exchange,提问作者Seb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 23:21:02