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

Kotlin中调用getInstance()提示未解析引用问题求助

解决GlobalHolder.getInstance()未解析引用的问题

兄弟,看你贴的代码,问题出在Kotlin单例的写法上,这几个小错误直接导致了getInstance()无法被正确解析:

你的代码里的核心问题:

  • getInstance()是成员方法,不是类级别的方法:你直接用GlobalHolder.getInstance()调用,这要求该方法是静态的或者定义在伴生对象中,但你现在把它写在了类的成员位置,必须先创建GlobalHolder实例才能调用,这完全违背了单例的设计初衷。
  • 构造函数写法错误:Kotlin里私有构造函数的正确写法是private constructor(),而你写的private fun GlobalHolder(){}只是定义了一个私有函数,不是构造函数——这导致你的类其实还是有默认的公共构造,根本起不到限制实例创建的作用。
  • 单例实例初始化递归:你在类里直接写private val ourInstance = GlobalHolder(),这会在类初始化时递归调用构造函数,就算构造函数写法正确,也会直接导致栈溢出。

修正后的单例类代码

class GlobalHolder private constructor() { 
    private var pickerManager: PickerManager? = null 

    companion object {
        // Kotlin推荐的懒加载单例写法,线程安全且只会初始化一次
        val instance: GlobalHolder by lazy { GlobalHolder() }
    }

    fun getPickerManager(): PickerManager? { 
        return pickerManager 
    } 

    fun setPickerManager(pickerManager: PickerManager) { 
        this.pickerManager = pickerManager 
    } 
}

对应的调用代码修改

lateinit var pickerManager: PickerManager 
// 注意处理null的情况,避免lateinit变量未初始化崩溃
pickerManager = GlobalHolder.instance.getPickerManager() ?: throw IllegalStateException("PickerManager未初始化")

如果你想保留getInstance()方法名

也可以把伴生对象里的代码改成这样,和你原来的调用方式完全匹配:

companion object {
    private val ourInstance by lazy { GlobalHolder() }
    fun getInstance(): GlobalHolder {
        return ourInstance
    }
}

调用时就可以继续用GlobalHolder.getInstance()了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:34:59