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 object
s . Pensez-vous toujours que l'option 2 est la préférée?
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.