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

ссылка 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()