辛特尔顿在Kotlin有争论

Kotlin参考文献说,我可以使用object关键字创建一个单例,如下所示:

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

不过,我想通过一个论点来说明这个对象。 例如Android项目中的ApplicationContext。

有没有办法做到这一点?

由于对象没有构造函数,我已经做了以下操作来在初始设置中注入值。 你可以随心所欲地调用这个函数,随时可以调用它来修改这个值(或者根据你的需要重建单例)。

 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注入库很容易使用,并有其他形式的单例,包括每个线程,基于键等等。不确定是否在你的问题的上下文中,但是这里有两个链接:

  • Injekt(我的,我是作者): https : //github.com/kohesive/injekt
  • Kodein(类似于Injekt): https : //github.com/SalomonBrys/Kodein

通常在Android中,人们使用像这样的库,或Dagger等来完成参数化单例,范围等。