Синглтон с аргументом в Котлине
ссылка Kotlin говорит, что я могу создать синглтон, используя ключевое слово object:
object DataProviderManager {
fun registerDataProvider(provider: DataProvider) {
//
}
}
Однако я хотел бы передать аргумент этому объекту. Например, ApplicationContext в проекте Android.
Есть ли способ сделать это?
Ответы
Ответ 1
Так как у объектов нет конструкторов, то я сделал следующее для ввода значений начальной настройки. Вы можете вызывать функцию так, как хотите, и ее можно вызвать в любое время, чтобы изменить значение (или восстановить один синглтон на основе ваших потребностей).
object Singleton {
private var myData: String = ""
fun init(data: String) {
myData = data
}
fun singletonDemo() {
System.out.println("Singleton Data: ${myData}")
}
}
Ответ 2
У Kotlin есть функция Перегрузка оператора, позволяющая передавать аргументы непосредственно объекту.
object DataProviderManager {
fun registerDataProvider(provider: String) {
//
}
operator fun invoke(context: ApplicationContext): DataProviderManager {
//...
return this
}
}
//...
val myManager: DataProviderManager = DataProviderManager(someContext)
Ответ 3
Существуют также две собственные библиотеки инъекций Kotlin, которые довольно просты в использовании и имеют другие формы одиночных игр, в том числе по потоку, основанные на ключах и т.д. Не уверен, что в контексте вашего вопроса, но здесь есть ссылки на оба:
Обычно в Android люди используют такую библиотеку, или Dagger, и др., чтобы выполнить параметрирование синглтонов, просмотр их и т.д.
Ответ 4
Я рекомендую вам использовать эту форму для передачи аргументов в одиночном коде в Kotlin, чтобы узнать, что ваш конструктор лишен и заблокирован:
object Singleton {
fun instance(context: Context): Singleton {
return this
}
fun SaveData() {}
}
и вы называете это так в деятельности
Singleton.instance(this).SaveData()