Ответ 1
Это очень разные атрибуты, и вы можете иметь тот или иной независимо. Все они действительны:
@Provides User currentUser(...) {}
@Provides static User currentUser(...) {}
@Provides @Singleton User currentUser(...) {}
@Provides @Singleton static User currentUser(...) {}
Чтобы установить сцену, метод @Provides User
говорит "для этого компонента или его зависимостей, вызовите этот метод @Provides каждый раз, когда вам нужен пользователь". Обычно метод будет возвращать новый экземпляр каждый раз, а кинжал не будет сохранять или кэшировать экземпляр.
@Singleton
- это пример области действия, которая представляет собой причудливый способ сказать политику жизненного цикла или политику, как часто создавать новый экземпляр. @Provides @Singleton User
говорит "для этого компонента или зависимостей, просто вызовите этот метод @Provides один раз и сохраните результат". @Singleton
- это встроенный общий случай, но вы также можете представить себе создание @UserScope
(всегда возвращать тот же экземпляр для этого пользователя) или в Android a @FragmentScope
или @ActivityScope
.
В вашем конкретном случае вы, вероятно, не хотите @Singleton
, потому что он поручил вашему компоненту сохранять или кэшировать значение из AuthManager. Если значение пользователя может измениться в течение срока действия вашего приложения, компонент не будет отражать это. (В этом случае вы также захотите ввести Provider<User>
, который будет обновляться, а не User
, который не будет.)
Оставляя на некоторое время видимые области, static
ведет себя точно так, как вы ожидаете, на Java: если метод не требует какого-либо состояния экземпляра, вы можете сделать его static
, и ваша виртуальная машина может позвонить он без подготовки какого-либо состояния экземпляра. В вашей сгенерированной реализации компонента Dagger будет автоматически вызывать методы static
статически и методы экземпляра экземпляра модуля, которые вы передаете в свой Компонент; в Android это приводит к значительному увеличению производительности. Поскольку вы не используете какое-либо состояние экземпляра в своем методе currentUser
, его можно легко сделать static
.
Дальнейшее чтение:
- SO: Области в кинжале 2
- Dagger docs: Component (см. заголовок "Область" )