Kotlin的创建单例

456 阅读2分钟

在 Kotlin 中,你可以使用对象声明(Object Declaration)来创建单例。对象声明是 Kotlin 中声明单例的一种简单方式,它确保类只有一个实例,并提供了一种方便的方法来访问该实例。以下是一个简单的单例示例:

object MySingleton {
    init {
        println("Singleton instance created")
    }

    fun doSomething() {
        println("Singleton is doing something")
    }
}

fun main() {
    // 访问单例对象
    MySingleton.doSomething()

    // 注意:MySingleton 对象只有一个实例,再次创建时不会执行 init 块
    MySingleton.doSomething()
}

输出:

Singleton instance created
Singleton is doing something
Singleton is doing something

在上面的例子中,MySingleton 是一个单例对象声明。对象声明会在首次访问时被延迟初始化,确保只有一个实例被创建。init 块中的代码会在对象第一次使用时执行。在 main 函数中,我们访问了单例对象的函数 doSomething

请注意,Kotlin 的对象声明是线程安全的,因此在多线程环境中使用时不需要担心并发问题

除了使用对象声明外,你还可以使用伴生对象(Companion Object)来创建单例。伴生对象是与类关联的单例对象,可以通过类名直接访问。以下是一个使用伴生对象创建单例的示例:

class MySingleton private constructor() {
    companion object {
        private val instance = MySingleton()

        fun getInstance(): MySingleton {
            return instance
        }
    }

    init {
        println("Singleton instance created")
    }

    fun doSomething() {
        println("Singleton is doing something")
    }
}

fun main() {
    // 访问单例对象
    MySingleton.getInstance().doSomething()

    // 注意:MySingleton 对象只有一个实例,再次创建时不会执行 init 块
    MySingleton.getInstance().doSomething()
}

输出:

Singleton instance created
Singleton is doing something
Singleton is doing something

在这个例子中,MySingleton 类有一个私有的构造函数,而它的实例通过伴生对象的 instance 属性进行初始化。getInstance 函数用于获取该实例。在 main 函数中,我们通过调用 getInstance 函数来访问单例对象。这种方式在某些情况下更适合需要更多控制权的情况。