如何在Kotlin中使数据类单例?

时间:2019-05-23 08:47:38

标签: kotlin singleton

假设我有一个数据类:

data class SensorData(val name: String, val temp : Double)

我通过REST服务或内部setter方法创建此SensorData对象,而name总是填充的,temp可能为空。

此外,我需要通过多个类来使用这个SensorData对象,那就是我想到的使用singleton

很明显,我需要object关键字as described here,但是如何结合data class object呢?

3 个答案:

答案 0 :(得分:1)

我认为您对Singleton的理解是错误的:

“单例模式是一种软件设计模式,它将类的实例化限制为一个“单个”实例”。

它不仅用于将其公开给所有类,还用于限制实例数。

数据类是用于存储数据的类,为什么它应该是单例呢?

重新考虑您的体系结构以使其在需要时可访问。

答案 1 :(得分:1)

您可以使用伴侣对象保留对数据对象的引用:

data class SensorData(val name: String, var temp : Double) {
    companion object {
        @Volatile
        @JvmStatic
        private var INSTANCE: SensorData? = null

        @JvmStatic
        @JvmOverloads
        fun getInstance(name: String = "default", temp : Double = 0.0): SensorData = INSTANCE ?: synchronized(this) {
            INSTANCE ?: SensorData(name, temp).also { INSTANCE = it }
        }
    }
}

并像这样使用它:

val name1 = SensorData.getInstance("name", 5.0).name

// Or with default values:
val name2 = SensorData.getInstance().name

答案 2 :(得分:0)

不要将数据类用作单例。那不是他们设计的目的。更好的方法是围绕您的数据类创建一个包装对象,该包装对象处理您的SensorData-Object。如果您第二次轮询REST服务,这还将允许您使用多个SensorData对象(将来可能需要)或将当前对象替换为新对象。

pthread_join