【问题标题】:Why use companion object to make singleton in Kotlin?为什么在 Kotlin 中使用伴生对象来制作单例?
【发布时间】:2022-01-16 18:22:05
【问题描述】:

我正在研究android kotlin中的创建模式(单例模式)。

我对通过伴生对象和对象制作单例对象的区别有疑问。

在某些示例中,单例是这样制作的。

class ABC {
  companion object {
    private var sInstance: ABC? = null
    
    fun getInstance(): ABC {
        if (sInstance == null) sInstance = ABC()
        return sInstance ?: throw IllegalStateException("")
    }
  }
}

但是用上面的方法,

// a and b are not same object
val a = ABC()
val b = ABC.getInstance()

println(a == b) // false

但据我所知,kotlin 中的单例只是 object

所以,我的问题是“为什么,当使用伴生对象来制作单例对象时”

【问题讨论】:

  • this answer的前几句。这能回答你的问题吗?
  • @lucidbot // 我明白了,非常感谢 :)

标签: android kotlin


【解决方案1】:

getInstance() 只是创建单例的“传统”方式。这是一种常见的技术,例如Java,因为与 Kotlin 不同,Java 没有语言本身提供的单例。出于这个原因,您也会不时在 Kotlin 中看到 getInstance()。可能是从 Java 移植过来的代码,也可能是 Java 比较有经验的人开发的,所以不知道 Kotlin 有没有更好的选择等等。

此外,object 几乎是静态的。如果我们有更复杂的创建单例的逻辑,可能需要通过某种工厂(例如伴生对象)来创建它。

所以我想说,经验法则是使用object 作为默认值,并且只有在不可能的情况下,手动创建它。在后一种情况下,使用属性而不是 getInstance() 函数更像是“Kotlin-ish”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多