web-dev-qa-db-fra.com

Dagger singleton vs objet Kotlin

Pour définir un singleton, dois-je utiliser la déclaration d'objet Kotlin ou créer une classe Kotlin ordinaire et l'injecter à l'aide d'un poignard? À mon avis, la première option est certainement plus facile, mais il peut y avoir une raison d'utiliser le poignard dans cette situation que je ne connais pas.

Option 1 (remarque object mot clé):

object SomeUtil {
    // object state (properties)

    fun someFunction(number: Long) {
        // ...
    }
}

Option 2 (remarque class mot clé):

class SomeUtil {
    // object state (properties)

    fun someFunction(number: Long) {
        // ...
    }
}
@Module
class AppModule {

    @Provides
    @Singleton
    internal fun provideTheUtil() = SomeUtil()
}
class MainActivity : BaseActivity() {

    @Inject internal lateinit var util: SomeUtil
}

MISE À JOUR 2019-07-03

@Blackbelt a déclaré dans les commentaires que nous devrions préférer l'option 2 pour la testabilité. Mais les bibliothèques comme MockK peuvent aussi mock objects . Pensez-vous toujours que l'option 2 est la préférée?

16
Mahozad

Vous devez utiliser l'option 2.

En génie logiciel, le modèle singleton est un modèle de conception logicielle qui limite l'instanciation d'une classe à une seule instance. Ceci est utile lorsque exactement un objet est nécessaire pour coordonner les actions à travers le système.

De: motif singleton

Ainsi, un singleton est une instance unique dans une étendue. Dans le cas d'Android, il s'agit d'une instance de machine virtuelle exécutant l'application. Si vous avez besoin d'étendues personnalisées, vous devez utiliser uniquement l'option 2.

Mais, si vous n'avez que des méthodes statiques à l'intérieur de l'objet, vous voulez injecter mieux pour les conserver en tant que méthodes globales et même vous débarrasser de object. Pas besoin d'injecter quoi que ce soit. Elle est similaire à une classe Java avec uniquement des méthodes statiques (j'ai mentionné ce point car c'est une manière habituelle de créer des classes Utility).

Cependant, si le object a également un certain état. Je recommanderais d'aller de manière poignardée. La méthode object ne fournit pas d'injection de dépendance. Il crée uniquement un Singleton. Votre but pour utiliser la dague est l'injection de dépendance.

0
Embydextrous