如何在Kotlin中创建一个单例数据类?

unhi4e5o  于 2022-11-25  发布在  Kotlin
关注(0)|答案(4)|浏览(122)

假设我有一个数据类:

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

我从REST服务或通过内部setter方法创建了这个SensorData对象,而name总是被填充,temp可能是空的。
进一步讲,我需要这个SensorData对象通过几个类,这就是我想到使用的singleton
显然我需要object关键字as described here,但是我如何合并data class object呢?

hkmswyz6

hkmswyz61#

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

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
rqmkfv5c

rqmkfv5c2#

我想你把单例的概念搞错了:

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

它不仅用于使其对所有类公开,还用于限制示例的数量。
一个数据类是一个存储数据的类,为什么它应该是一个Singleton?
重新考虑您的架构,使其可在需要时访问。

u3r8eeie

u3r8eeie3#

不要将数据类作为单例使用。这不是它们的设计目的。一个更好的方法是在数据类周围创建一个 Package 器对象,用于处理SensorData对象。这也将允许您使用多个SensorData对象(将来可能需要),或者在您第二次轮询REST服务时用新对象替换当前对象。

object SensorDataService {
 var sensorData: SensorData? = null
}

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

vs91vp4v4#

在我看来,你应该重新考虑你的体系结构,因为数据类是用来存储数据的,那么为什么它应该是一个单例呢?它不仅仅是用来让它对所有类都是公共的,而且还限制了示例的数量。

相关问题