我想知道创建单例类的方法,以便我的Util类每个应用程序只实例化一次.但是当我将我的Java类转换为kotlin时,会生成以下代码.
这个对吗?
companion object {
private var utilProject: UtilProject? = null
val instance: UtilProject
get() {
if (utilProject == null) utilProject = UtilProject()
return utilProject!!
}
}
我可以找到一个相关的question,但它是带参数的,我没有在没有参数的情况下进行转换.
解决方法:
只是
companion object {
val instance = UtilProject()
}
将完成这项工作,因为伴侣对象本身是一个语言级单身人士.
(首次调用伴随对象时将分配实例.)
– 更新 –
如果需要在启动单例对象时进行调整,可以为每个类创建一个对象.
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
}
综上所述,
对象或伴侣对象是Kotlin中的一个单独对象.
您可以在一个或多个对象中分配变量,然后像使用单个变量一样使用变量.
对象或伴随对象在首次使用时进行实例化.
当对象首次被实例化时(即,首次使用对象时),初始化对象中的val和vars.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。