Android 带初始检查的单例

Android 带初始检查的单例,android,kotlin,Android,Kotlin,我正在Kotlin中开发一个singleton类,但我想检查lateinit变量“instance”是否已初始化,而不是检查是否为null,但它不起作用。我认为最好像lateinit那样初始化变量,而不像null变量那样初始化 companion object { private lateinit var instance: GameDAO fun getInstance(): GameDAO { if (!::instance.isInitialized) {

我正在Kotlin中开发一个singleton类,但我想检查lateinit变量“instance”是否已初始化,而不是检查是否为null,但它不起作用。我认为最好像lateinit那样初始化变量,而不像null变量那样初始化

companion object {
    private lateinit var instance: GameDAO

    fun getInstance(): GameDAO {
        if (!::instance.isInitialized) {
            synchronized(this) {
                instance = GameDAO()
            }
        }
        return instance
    }
}
编译器将显示下一个错误:

我认为,最好使用
lazy
函数在第一次请求时惰性地初始化一个值。有关详细信息,请参阅

e、 g

您不需要单独的
getInstance
函数:您可以直接访问
instance
属性,它将在第一次请求时初始化(以线程安全的方式)

这是假设您只希望在首次请求时初始化对象(即延迟初始化)。如果您希望始终创建它,那么您可以构造它并立即将其分配给变量/属性

object GameDao {
    fun hereGoesYourFunctions()
}

调用heregoesyour函数将初始化GameDao类。

您可以尝试更好的方法:

class SingletonClass private constructor() {

init {
    println("This ($this) is a singleton")
}

private object Holder {
    val INSTANCE = SingletonClass()
}

companion object {
    val instance: SingletonClass by lazy {
        Holder.INSTANCE
    }
}

你有没有检查过这个kotlin已经有了singleton的对象,不需要你自己去做。不,这在kotlin中根本不是一个更好的方法。最好通过lazy使用
,而不是
=lazy
()。同意,谢谢@AlexeyRomanov。已经相应地更新了我的答案。如果没有可用的默认构造函数怎么办?您不需要使用默认构造函数。传递给
lazy
的lambda中的代码可以访问范围内的任何变量,因此可以使用这些变量来构造需要参数的对象。(显然,这些变量本身也需要初始化。)
class SingletonClass private constructor() {

init {
    println("This ($this) is a singleton")
}

private object Holder {
    val INSTANCE = SingletonClass()
}

companion object {
    val instance: SingletonClass by lazy {
        Holder.INSTANCE
    }
}