如何在 Kotlin 中制作数据 class 单例?

How to make a data class singleton in Kotlin?

假设我有一个数据class:

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

我从 REST 服务或内部 setter 方法创建此 SensorData 对象,而 name 始终填充并且 temp 可能为空。

此外,我需要通过几个 class 这个 SensorData 对象,所以我想到了使用 singleton

显然我需要 object 关键字 as described here,但我如何组合 data class object

我认为你对单例的概念理解有误:

"The singleton pattern is a software design pattern that restricts the instantiation of a class to one "单"实例"

它不仅是为了让所有 class 都成为 public,而且是为了限制实例的数量。

一个数据class是一个class来存储数据,为什么要是Singleton呢?

重新考虑您的架构,使其在您需要的地方易于访问。

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

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

不要将数据 class 用作单例。这不是它们的设计目的。更好的方法是围绕您的数据 class 创建一个包装器对象,它处理您的 SensorData-Object(s)。这也将允许您使用多个 SensorData 对象(将来可能需要),或者如果您第二次轮询 REST-Service,则用新对象替换当前对象。

object SensorDataService {
 var sensorData: SensorData? = null
}

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