匕首模块类的提供程序功能的注释

时间:2019-12-26 13:35:10

标签: android kotlin dagger-2

我正在使用Kotlin和Dagger 2开发一个Android项目。我有一个NetworkModule,其中定义了一些提供程序功能。

@Module
object NetworkModule {
   @Provides
   @JvmStatic  // Here uses @JvmStatic
   internal fun provideSomething(): Something {
      ...
   }
}

我看到有些人使用Kotlin @JvmStatic,有些人使用匕首的@Reusable来注释提供程序功能:

@Module
object NetworkModule {
   @Provides
   @Reusable  // Here uses @Reusable
   internal fun provideSomething(): Something {
      ...
   }
}

和..某些人同时使用:

@Module
object NetworkModule {
   @Provides
   @JvmStatic // Here use both @JvmStatic
   @Reusable  // and uses @Reusable
   internal fun provideSomething(): Something {
      ...
   }
}

我很困惑。我的两个问题是:

  1. @JvmStatic和/或@Reusable进行注释的动机是什么?这样做的原因是什么?这样做的好处是什么?

  2. 使用@JvmStatic@Reusable哪个更好?还是一个很好?还是我应该同时使用两者?如果是,那么同时使用两者的原因是什么?

1 个答案:

答案 0 :(得分:0)

如果您将模块声明为Kotlin对象,则需要@JvmStatic。该限制已通过dagger 2.25删除。您还可以查看this issue了解更多信息。

如果您使用Dagger 2.25或更高版本,则不再需要使用@JvmStatic

来自@Reusable文档:

  

一个范围,该范围指示绑定返回的对象可以(但可能不会)被重用。

     

{@ code @Reusable}在您希望限制一种类型的配置的数量时非常有用,但是没有特定的生存期,只能有一个实例。

如果您在多个位置注入相同的对象,并且具有相同的实例不是问题,那么这有助于避免为每种用法创建新对象。

@JvmStatic@Reusable彼此不相关,根据您的需要,您可以使用其中一个,另一个或两者。