只是
companion object {
val instance = UtilProject()
}
将完成这项工作,因为 伴随对象 本身是语言级别的单例。
(instance 将在 first 调用伴生对象时创建。)
-- 更新了--
如果需要控制单例对象的初始化时间,可以为每个类创建一个对象。
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
}
这里,AnotherClass.instance 在实际调用 AnotherClass.instance 之前被初始化。它在调用AnotherClass 的伴随对象时被初始化。
为了防止它在需要时被初始化,你可以这样使用:
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.
}
如果你不关心每个单例的初始化时间,你也可以这样使用:
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
}
总之,
object 或 companion object 是 Kotlin 中的一个单例对象。
您可以在 object 或 objects 中分配变量,然后像使用单例一样使用这些变量。
object 或 companion object 在第一次使用时被实例化。
object 中的 vals 和 vars 在首次实例化 object 时(即首次使用 object 时)进行初始化。