Sobes.tech
Назад к вопросам
Junior — Middle
62

Как Hof зависимость, отмеченная аннотацией Singleton, сохраняется в рамках внедрения зависимостей Dagger?

Компании, где спрашивали
AstonAston

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Аннотация @Singleton в Dagger не делает объект глобальным сама по себе, а задаёт область жизни зависимости внутри конкретного графа зависимостей. Если один и тот же Component живёт долго, Dagger будет возвращать один и тот же экземпляр для этой зависимости. При создании нового Component кэш сбрасывается, и экземпляр создаётся заново.

Определение:

@Singleton в Dagger — это scope-аннотация, которая говорит, что в пределах одного Component зависимость должна создаваться один раз и переиспользоваться при последующих запросах. Dagger сохраняет такой объект в internal cache компонента и возвращает его повторно, пока жив сам компонент. Важно: @Singleton работает только если и провайдер, и Component согласованы по scope.

Пример использования:

@Singleton
@Component(modules = [NetworkModule::class])
interface AppComponent {
    fun apiClient(): ApiClient
}

@Module
class NetworkModule {
    @Provides
    @Singleton
    fun provideApiClient(): ApiClient {
        return ApiClient()
    }
}

class ApiClient

Если несколько раз вызвать appComponent.apiClient(), будет возвращён один и тот же экземпляр ApiClient.

Пояснение кода:

  1. @Singleton на provideApiClient() помечает зависимость как scoped.
  2. @Singleton на AppComponent задаёт область, в которой этот scope действует.
  3. При первом запросе ApiClient Dagger создаёт объект и сохраняет его внутри AppComponent.
  4. При следующих запросах тот же AppComponent отдаёт уже сохранённый экземпляр.
  5. Если создать новый AppComponent, будет создан новый ApiClient, потому что кэш привязан к компоненту, а не к процессу приложения.

Ключевые моменты:

  • @Singleton в Dagger — это не “один на всё приложение”, а “один на область компонента”.
  • Экземпляр хранится в кэше внутри Component.
  • Повторный запрос из того же Component вернёт тот же объект.
  • Новый Component означает новый кэш и новый экземпляр.
  • Scope аннотация должна быть согласована между зависимостью и компонентом.
  • Для Android обычно @Singleton связывают с AppComponent, а не с Activity или Fragment-компонентами.