首页 文章

单身人士与科特林的争论

提问于
浏览
24

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

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

但是,我想将一个参数传递给该对象 . 例如,Android项目中的ApplicationContext .

有没有办法做到这一点?

4 回答

  • 4

    由于对象没有构造函数,因此我在以下步骤中将值注入初始设置 . 您可以随意调用该函数,并且可以随时调用它来修改值(或根据您的需要重新构建单例) .

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

    Kotlin有一个名为Operator overloading的功能,允许您将参数直接传递给对象 .

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

    还有两个本机Kotlin注入库非常容易使用,并且有其他形式的单例,包括每个线程,基于密钥等 . 不确定是否在您的问题的上下文中,但这里是两者的链接:

    通常在Android中,人们使用这样的库,或者Dagger等人来完成参数化单例,确定它们的范围等 .

  • 1

    我建议您使用此表单在kotlin借记的siglot中传递参数,即构造函数被剥夺和阻止的对象:

    object Singleton {
    
    fun instance(context: Context): Singleton {
        return this
    }
    
    fun SaveData() {}
    

    }

    你在活动中这样称呼它

    Singleton.instance(this).SaveData()
    

相关问题