我想知道创建单例类的方法,以便我的Util类每个应用程序只实例化一次.但是当我将我的Java类转换为kotlin时,会生成以下代码.
它是否正确?
companion object {
private var utilProject: UtilProject? = null
val instance: UtilProject
get() {
if (utilProject == null) utilProject = UtilProject()
return utilProject!!
}
}
Run Code Online (Sandbox Code Playgroud)
我可以找到一个相关的问题,但它是带参数的,我没有在没有参数的情况下进行转换.
dey*_*dey 41
objectKotlin中有一个特殊的单身人士关键字.你可以输入像这样简单的东西来获得工作单例类:
object MySingleton
Run Code Online (Sandbox Code Playgroud)
或者当你想要一些成员函数时:
object MySingleton {
fun someFunction(...) {...}
}
Run Code Online (Sandbox Code Playgroud)
然后使用它:
MySingleton.someFunction(...)
Run Code Online (Sandbox Code Playgroud)
有一个参考:https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations
Nae*_*mul 28
只是
companion object {
val instance = UtilProject()
}
Run Code Online (Sandbox Code Playgroud)
将完成这项工作,因为伴侣对象本身是一个语言级单身人士.
(首次调用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 // 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
}
Run Code Online (Sandbox Code Playgroud)
这里,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.
}
Run Code Online (Sandbox Code Playgroud)
如果您不关心每个单例初始化时,您也可以这样使用:
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
}
Run Code Online (Sandbox Code Playgroud)
总之,在Kotlin中,
a object或a companion object是一个单独的对象.
您可以在指定变量对象或对象,然后用以前一样单身的变量.
object或companion object在首次使用时实例化.
当首次实例化时(即,首次使用时)初始化s中的vals和vars .objectobjectobject
Mic*_*oka 11
超级简单的懒人例子:
companion object {
val instance: UtilProject by lazy { UtilProject() }
}
Run Code Online (Sandbox Code Playgroud)
小智 5
只需要单词 object。
object UtilProject {
var bar: Int = 0
fun foo() {
}
}
Run Code Online (Sandbox Code Playgroud)
而你直接访问只有一个实例的对象
fun main(args: Array<String>) {
UtilProject.bar = 1
println(UtilProject.bar)
}
Run Code Online (Sandbox Code Playgroud)