如何在 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)
假设我有一个数据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)