的Kotlin reference論點說,我可以用對象關鍵字,像這樣創建一個單例:辛格爾頓在科特林
object DataProviderManager {
fun registerDataProvider(provider: DataProvider) {
//
}
}
不過,我想傳遞一個參數傳遞給該對象。例如Android項目中的ApplicationContext。
有沒有辦法做到這一點?
的Kotlin reference論點說,我可以用對象關鍵字,像這樣創建一個單例:辛格爾頓在科特林
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}")
}
}
還有兩個是很容易使用,並且有其他形式的單身人士,包括每個線程,關鍵的基礎,等等。不知道是你的問題的情況下,但這裏有天然的科特林注射庫鏈接到兩個:
通常在Android中,人們使用像這樣的庫或Dagger等來完成參數化單例,對其進行範圍等。
Kotlin有一個名爲Operator overloading的功能,可讓您直接將參數傳遞給對象。
object DataProviderManager {
fun registerDataProvider(provider: String) {
//
}
operator fun invoke(context: ApplicationContext): DataProviderManager {
//...
return this
}
}
//...
val myManager: DataProviderManager = DataProviderManager(someContext)
這和Jeremy的解決方案一樣,但語法不同。單身人士仍然沒有任何參數。 – jakk
如果你想讓它像一個構造函數一樣工作,你可以簡單地返回'this'。我已經更新了答案,證明了這一點。 – breandan
好吧,但是如果不調用'invoke'方法,是什麼讓你無法使用該對象呢? – jakk