android – Kotlin中的Singleton类

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

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...