Синглтон с аргументом в Котлине

Ссылка Kotlin говорит, что я могу создать singleton, используя ключевое слово object :

object DataProviderManager { fun registerDataProvider(provider: DataProvider) { // } } 

Тем не менее, я хотел бы передать аргумент этому объекту. Например, ApplicationContext в Android-проекте.

Есть ли способ сделать это?

Поскольку объекты не имеют конструкторов, я сделал следующее для ввода значений начальной настройки. Вы можете вызывать функцию независимо от того, что хотите, и ее можно вызвать в любое время, чтобы изменить значение (или воссоздать синглтон на основе ваших потребностей).

 object Singleton { private var myData: String = "" fun init(data: String) { myData = data } fun singletonDemo() { System.out.println("Singleton Data: ${myData}") } } 

У Kotlin есть функция, называемая перегрузкой оператора , позволяющая передавать аргументы непосредственно объекту.

 object DataProviderManager { fun registerDataProvider(provider: String) { // } operator fun invoke(context: ApplicationContext): DataProviderManager { //... return this } } //... val myManager: DataProviderManager = DataProviderManager(someContext) 

Есть также две собственные библиотеки инъекций Kotlin, которые довольно просты в использовании и имеют другие формы синглетонов, в том числе по потоку, основанные на ключах и т. Д. Не уверен, что в контексте вашего вопроса, но здесь есть ссылки на оба:

Обычно в Android люди используют библиотеку, подобную этой, или Dagger, и др., Чтобы выполнить параметрирование одиночных чисел, определение их и т. Д.