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
相关产品推荐
相关产品推荐

