【问题标题】:Should I use @Singleton, object or both with Dagger2 and Kotlin?我应该在 Dagger2 和 Kotlin 中使用 @Singleton、object 还是两者都使用?
【发布时间】:2020-02-05 00:51:30
【问题描述】:

我正在使用 Kotlin 和 Dagger2 做一个应用程序,试图遵循 MVVM 模式,但我处于两难境地,我应该使用 @Singleton、object 还是两者兼而有之?为什么?假设我有一个 RepositoryMovies 类,我想每次都获取相同的实例,根据我的研究,您可以这样做:

@Singleton(Dagger2 方式)

@Singleton
class RepositoryMovies {
    TODO()
}

对象(Kotlin 方式)

object RepositoryMovies {
    TODO()
}

两者

@Singleton
object RepositoryMovies {
    TODO()
}

不要让我按照“Java-Way”开始在 Kotlin 中使用单例。我会很感激你的帮助。非常感谢。

【问题讨论】:

  • 我使用 Dagger 的次数不多,但我认为两者都可以。但是,您可以在类中使用构造函数参数,这在测试以注入测试资源时可能会派上用场。
  • 如以下匕首代码实验室所示,Google 使用 @Singleton 和 class 关键字:codelabs.developers.google.com/codelabs/android-dagger/#12

标签: android kotlin singleton dagger


【解决方案1】:

注入object没有多大意义,因为在kotlin中object是用来模拟java的实用程序classes,比如java的ArraysCollectionsclasses。此类类的一个定义特征是,它们不与您项目中的任何特定 class 相关联,它们可以在任何地方被要求和使用。

另一方面,在大多数实际情况下,repository 将与特定的class 相关联。例如,您可能只想在UserViewModel 中注入UserRepository,因为这是您需要访问用户信息的唯一地方。

至于object@Singletonobject 的定义是singleton,因此用@Singleton 标记它是多余的,并且在通过@ 使其可注入之前不会完成任何事情987654337@function。必须在哪里指定,dagger如何创建这个类的instances

在您的第一个示例中,标记类 @Singleton 不会做任何事情,除非它是可注入的。如文档所述。

单例和作用域绑定

使用@Singleton 注释@Provides 方法或可注入类。该图将使用值的单个实例 它的所有客户。

【讨论】:

  • RepositoryMovies 是可注入的,这就是为什么它上面有“@Singleton”。我没有找到您的答案的明确解决方案,我仍然不知道正确的方法是什么。两者都使用似乎没问题,如果其他人没有从 Dagger 获取实例,它会阻止其他人创建 RepositoryMovies 实例,并且它遵循 Dagger 的最佳实践。
猜你喜欢
  • 2017-08-29
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 2010-12-13
相关资源
最近更新 更多