sunflower example app by Google使用带有伴侣对象的私有类来实现其存储库的Singleton模式,而不是简单地将存储库实现为(固有地为Singleton)对象。
这是我第一次看到Singleton在Kotlin中以这种方式实现,而不是将其实现为Object。在什么情况下应使用此私有构造函数实现而不是更常见的Object实现?
class GardenPlantingRepository private constructor(
private val gardenPlantingDao: GardenPlantingDao
) {
suspend fun createGardenPlanting(plantId: String) {
withContext(IO) {
val gardenPlanting = GardenPlanting(plantId)
gardenPlantingDao.insertGardenPlanting(gardenPlanting)
}
}
suspend fun removeGardenPlanting(gardenPlanting: GardenPlanting) {
withContext(IO) {
gardenPlantingDao.deleteGardenPlanting(gardenPlanting)
}
}
fun getGardenPlantingForPlant(plantId: String) =
gardenPlantingDao.getGardenPlantingForPlant(plantId)
fun getGardenPlantings() = gardenPlantingDao.getGardenPlantings()
fun getPlantAndGardenPlantings() = gardenPlantingDao.getPlantAndGardenPlantings()
companion object {
// For Singleton instantiation
@Volatile private var instance: GardenPlantingRepository? = null
fun getInstance(gardenPlantingDao: GardenPlantingDao) =
instance ?: synchronized(this) {
instance ?: GardenPlantingRepository(gardenPlantingDao).also { instance = it }
}
}
}
答案 0 :(得分:1)
如果您的单例实例需要使用参数object
的情况(例如此处的示例),则使用GardenPlantingDao
是一个问题,因为它们不能接受构造函数参数。这在Android上经常出现,因为在很多情况下,单身人士需要Context
才能操作。
在这些情况下,您可以仍然使用object
,但这可能不安全或不方便:
采用“传统”方式通过私有构造函数和工厂方法来实现单例。