В чем разница между аннотацией Provides и Binds

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

Ответ

@Provides и @Binds — это аннотации Dagger для внедрения зависимостей.

@Provides используется в модулях для создания экземпляров зависимостей, если их нельзя создать через конструктор (например, интерфейсы, сторонние библиотеки).

@Module
class AppModule {  
    @Provides  
    fun provideRepository(): Repository = RepositoryImpl()  
}  

@Binds используется в абстрактных модулях для связывания интерфейса с его реализацией без явного создания объекта (более эффективно, чем @Provides).

@Module  
abstract class AppModule {  
    @Binds  
    abstract fun bindRepository(repo: RepositoryImpl): Repository  
}  

Разница:

  • @Provides создает объект, @Binds только связывает интерфейс с готовой реализацией.
  • @Binds работает только в абстрактных модулях и методах.
  • @Binds эффективнее, так как не генерирует лишний код.