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

问题描述 投票:0回答:5

假设我有一个数据类:

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

我通过 REST 服务或内部 setter 方法创建此

SensorData
对象,而
name
始终已填充,而
temp
可能为空。

此外,我需要通过几个类来获取这个 SensorData 对象,这就是我想到使用

singleton

显然我需要

object
关键字如此处所述,但是我如何组合
data class object

kotlin singleton data-class
5个回答
4
投票

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

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

4
投票

我认为你错误地理解了单例的概念:

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

它不仅用于向所有类公开,还用于限制实例的数量。

数据类就是存储数据的类,为什么一定要是Singleton呢?

重新思考您的架构,使其可在您需要的地方访问。


0
投票

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

object SensorDataService {
 var sensorData: SensorData? = null
}

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

0
投票

我想这应该可行!

object SensorDataSingleton {
    var data: SensorData? = null
}

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


-1
投票

在我看来,你应该重新考虑你的架构,因为数据类是用来存储数据的,那么为什么它应该是单例呢?它不仅用于将其公开给所有类,还用于限制实例的数量。

© www.soinside.com 2019 - 2024. All rights reserved.