假设我有一个数据类:
data class SensorData(val name: String, val temp : Double)
我通过 REST 服务或内部 setter 方法创建此
SensorData
对象,而 name
始终已填充,而 temp
可能为空。
此外,我需要通过几个类来获取这个 SensorData 对象,这就是我想到使用
singleton
。
显然我需要
object
关键字如此处所述,但是我如何组合data class object
?
您可以使用伴随对象来保留对数据对象的引用:
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
我认为你错误地理解了单例的概念:
“单例模式是一种软件设计模式,它将类的实例化限制为一个“单个”实例”
它不仅用于向所有类公开,还用于限制实例的数量。
数据类就是存储数据的类,为什么一定要是Singleton呢?
重新思考您的架构,使其可在您需要的地方访问。
不要将数据类用作单例。这不是它们设计的目的。更好的方法是围绕数据类创建一个包装对象,该对象处理您的 SensorData 对象。这还允许您使用多个 SensorData 对象(将来可能需要),或者如果您第二次轮询 REST-Service,则将当前对象替换为新对象。
object SensorDataService {
var sensorData: SensorData? = null
}
data class SensorData(val name: String, val temp : Double)
我想这应该可行!
object SensorDataSingleton {
var data: SensorData? = null
}
data class SensorData(val name: String, val temp: Double?)
在我看来,你应该重新考虑你的架构,因为数据类是用来存储数据的,那么为什么它应该是单例呢?它不仅用于将其公开给所有类,还用于限制实例的数量。