Kotlin的单身人士课程

Khe*_*raj 23 android kotlin

我想知道创建单例类的方法,以便我的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

  • 实际上,使用 `object` 而不是 `class` 是你的单身人士。[上面提到的参考](https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations) 值得一读;-) (4认同)
  • 使用“object”代替“class”是最优化的解决方案。如果你想从 JAVA 类调用对象内部的方法,你可以使用 `Singleton.INSTANCE.methodeName()..` (2认同)

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.instanceAnotherClass.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是一个单独的对象.
您可以在指定变量对象对象,然后用以前一样单身的变量.

objectcompanion object在首次使用时实例化. 当首次实例化时(即,首次使用时)初始化s中的vals和vars .objectobjectobject


Mic*_*oka 11

超级简单的懒人例子:

companion object {
    val instance: UtilProject by lazy { UtilProject() }
}
Run Code Online (Sandbox Code Playgroud)

  • 不需要!只需使用 object 关键字 (5认同)

小智 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)