Juste
companion object {
val instance = UtilProject()
}
fera l'affaire car le objet compagnon est lui-même un singleton de niveau langue.
(Le instance
sera créé lorsque l'objet compagnon sera premièrement appelé.)
-- Mis à jour --
Si vous devez contrôler le moment où l'objet singleton est initialisé, vous pouvez créer un objet pour chaque classe.
class UtilProject {
....
companion object {
val instance = UtilProject()
}
}
class AnotherClass {
...
companion object {
val instance = AnotherClass()
const val abc = "ABC"
}
}
fun main(args: Array<String>) {
val a = UtilProject.instance // UtilProject.instance will be initialized here.
val b = AnotherClass.abc // AnotherClass.instance will be initialized here because AnotherClass's companion object is instantiated.
val c = AnotherClass.instance
}
Ici, AnotherClass.instance
est initialisé avant AnotherClass.instance
est effectivement appelé. Il est initialisé lorsque AnotherClass
L'objet compagnon de l'utilisateur est appelé. Pour éviter qu'il soit initialisé avant le moment où il est nécessaire, vous pouvez utiliser comme ceci :
class UtilProject {
....
companion object {
fun f() = ...
}
}
class AnotherClass {
...
companion object {
const val abc = "ABC"
}
}
object UtilProjectSingleton {
val instance = UtilProject()
}
object AnotherClassSingleton {
val instance = AnotherClass()
}
fun main(args: Array<String>) {
UtilProject.f()
println(AnotherClass.abc)
val a = UtilProjectSingleton.instance // UtilProjectSingleton.instance will be initialized here.
val b = AnotherClassSingleton.instance // AnotherClassSingleton.instance will be initialized here.
val c = UtilProjectSingleton.instance // c is a.
}
Si vous ne vous souciez pas du moment où chaque singleton est initialisé, vous pouvez aussi l'utiliser comme ceci :
class UtilProject {
....
companion object {
fun f() = ...
}
}
class AnotherClass {
...
companion object {
const val abc = "ABC"
}
}
object Singletons {
val utilProject = UtilProject()
val anotherClass = AnotherClass()
}
fun main(args: Array<String>) {
val a = Singletons.utilProject
val b = Singletons.anotherClass
}
En résumé,
un object
ou un companion object
est un objet singleton en Kotlin.
Vous pouvez affecter des variables dans un objet o objets et ensuite utiliser les variables comme s'il s'agissait de singletons.
object
o companion object
est instancié lors de sa première utilisation. val
et var
dans un object
sont initialisés lorsque le object
est instancié pour la première fois (c'est-à-dire lorsque l'élément object
est utilisé pour la première fois).