Android 带初始检查的单例
我正在Kotlin中开发一个singleton类,但我想检查lateinit变量“instance”是否已初始化,而不是检查是否为null,但它不起作用。我认为最好像lateinit那样初始化变量,而不像null变量那样初始化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) {
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
}
}