2015-10-14 84 views
16

Kotlin reference論點說,我可以用對象關鍵字,像這樣創建一個單例:辛格爾頓在科特林

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

不過,我想傳遞一個參數傳遞給該對象。例如Android項目中的ApplicationContext。

有沒有辦法做到這一點?

回答

10

由於對象沒有構造函數,我已經做了以下操作來在初始設置中注入值。您可以隨時調用該函數,並隨時調用該函數來修改該值(或根據您的需要重新構建單例)。

object Singleton { 
    private var myData: String = "" 

    fun init(data: String) { 
     myData = data 
    } 

    fun singletonDemo() { 
     System.out.println("Singleton Data: ${myData}") 
    } 
} 
1

還有兩個是很容易使用,並且有其他形式的單身人士,包括每個線程,關鍵的基礎,等等。不知道是你的問題的情況下,但這裏有天然的科特林注射庫鏈接到兩個:

通常在Android中,人們使用像這樣的庫或Dagger等來完成參數化單例,對其進行範圍等。

3

Kotlin有一個名爲Operator overloading的功能,可讓您直接將參數傳遞給對象。

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

    operator fun invoke(context: ApplicationContext): DataProviderManager { 
     //... 
     return this 
    } 
} 

//... 
val myManager: DataProviderManager = DataProviderManager(someContext) 
+0

這和Jeremy的解決方案一樣,但語法不同。單身人士仍然沒有任何參數。 – jakk

+0

如果你想讓它像一個構造函數一樣工作,你可以簡單地返回'this'。我已經更新了答案,證明了這一點。 – breandan

+1

好吧,但是如果不調用'invoke'方法,是什麼讓你無法使用該對象呢? – jakk