Различные @Singleton & static @Provides в dagger2

Могу ли я узнать разницу между @Singleton VS static Предоставляет в dagger2?

@Provides static User currentUser(AuthManager authManager) {
    return authManager.currentUser();
}

@Provides @Singleton User currentUser(AuthManager authManager) {
    return authManager.currentUser();
}

Ответ 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.

Дальнейшее чтение:

Ответ 2

При аннотации @Singleton только один экземпляр объекта User будет создан на протяжении всего жизненного цикла приложения.

static по методам @Provides, введенным недавно, чтобы сделать вызов метода быстрее на 15-20%, как упоминалось здесь. Будет несколько экземпляров объекта User, если мы будем называть этот метод несколько раз.