只是
companion object {
val instance = UtilProject()
}
由于伴生对象本身是一种语言级别的单例,所以将起作用。
(当首次调用伴生对象时将创建instance
。)
-- 更新 --
如果您需要控制单例对象何时初始化,则可以为每个类创建一个对象。
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
val b = AnotherClass.abc
val c = 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
val b = AnotherClassSingleton.instance
val c = UtilProjectSingleton.instance
}
如果您不关心每个单例何时初始化,也可以像这样使用它:
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
}
简而言之,
在 Kotlin 中,object
或 companion object
是一个单例对象。
您可以在 object 或 objects 中分配变量,然后像单例一样使用这些变量。
object
或 companion object
在第一次使用时实例化。
object
中的 val
和 var
在第一次实例化该 object
时进行初始化(即第一次使用该 object
时)。
编辑:
William Hu 在评论中说,“companion object
是在加载类时发生的。”
companion object
,只需将class UtilProject
的声明更改为object UtilProject
。 - deyobject
代替class
就是单例模式。上面提到的参考链接值得一读 ;-) - Rolandobject
而不是class
是最优化的解决方案。如果您想从JAVA类中调用对象内的方法,可以使用Singleton.INSTANCE.methodName()
. - Ahmed Nezhi