Приведи пример когда можно Provides поменять на Binds

«Приведи пример когда можно Provides поменять на Binds» — вопрос из категории DI, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

@Provides используется, когда нужно создать объект вручную, а @Binds — когда просто связываешь интерфейс с его реализацией.

Пример замены @Provides на @Binds:

// Было (Provides)
@Module
class AppModule {
    @Provides
    fun provideRepository(impl: RepositoryImpl): Repository = impl
}

// Стало (Binds) - короче и эффективнее
@Module
interface AppModule {
    @Binds
    fun bindRepository(impl: RepositoryImpl): Repository
}

Почему @Binds лучше:

  • Не создаёт лишних объектов (просто возвращает готовый impl).
  • Работает быстрее, т.к. не требует фабричного метода.
  • Подходит, если зависимость уже есть в графе (например, через @Inject конструктор).

Ограничение: @Binds можно использовать только в abstract классе или interface модуля.