2015-10-14 16 views
16

Kotlin reference mówi, że mogę tworzyć pojedyncza pomocą obiektu słowa kluczowego tak:Singleton z argumentów w Kotlin

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

Jednak chciałbym przekazać argument do tego obiektu. Na przykład ApplicationContext w projekcie Android.

Czy istnieje sposób, aby to zrobić?

Odpowiedz

10

Ponieważ obiekty nie mają konstruktorów, wykonałem następujące czynności, aby wstrzyknąć wartości podczas początkowej konfiguracji. Możesz wywołać funkcję, którą chcesz i możesz ją wywołać w dowolnym momencie, aby zmodyfikować wartość (lub zrekonstruować singleton na podstawie twoich potrzeb).

object Singleton { 
    private var myData: String = "" 

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

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

Istnieją również dwa natywne biblioteki wtrysku Kotlin, które są dość łatwe w użyciu i mają inne formy pojedynczych nici, w tym za kluczowy oparty itp Nie wiem, czy to w kontekście pytania, ale tutaj linki do obu:

Zazwyczaj w Androidzie ludzie używają biblioteki takiej jak ta lub Dagger i inni do parametryzowania singletonów, określania ich zakresu itp.

3

Kotlin ma funkcję o nazwie Operator overloading, pozwalającą przekazywać argumenty bezpośrednio do obiektu.

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

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

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

Działa to tak samo, jak rozwiązanie Jeremy'ego, ale ma inną składnię. Singleton jest nadal tworzony bez żadnych argumentów. – jakk

+0

Jeśli chcesz, aby działał jak konstruktor, możesz po prostu zwrócić 'this'. Zaktualizowałem odpowiedź, demonstrując to. – breandan

+1

Ok, ale co uniemożliwia korzystanie z obiektu bez wywoływania metody 'invoke'? – jakk