Назад к вопросам
Middle
116
questionbank

Почему следует использовать аннотацию @Binds вместо аннотации @Provides?

Sobes Copilot

Получайте ответы в реальном времени

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

sobes.tech AI

Аннотация @Binds применяется для указания Dagger'у, какой конкретной реализации интерфейса он должен предоставить, когда запрашивается сам интерфейс.

Преимущества использования @Binds вместо @Provides в этом случае:

  • Производительность: @Binds является более производительной, так как Dagger генерирует меньше кода. Он просто связывает интерфейс с конкретным типом без создания нового экземпляра модуля.
  • Читаемость: Код становится более читаемым, поскольку явно видно, какой интерфейс реализуется каким классом.
  • Сокращение boilerplate-кода: При использовании @Binds не нужно писать дополнительный метод @Provides, который просто возвращает экземпляр реализации.

Пример:

Вместо:

@Module
class MyModule {

    @Provides
    fun provideMyInterface(implementation: MyInterfaceImpl): MyInterface {
        return implementation;
    }
}

interface MyInterface {
    // ...
}

class MyInterfaceImpl : MyInterface {
    // ...
}

Лучше использовать:

@Module
abstract class MyModule { // Модуль должен быть абстрактным

    @Binds
    abstract fun bindMyInterface(implementation: MyInterfaceImpl): MyInterface; // Метод должен быть абстрактным

}

interface MyInterface {
    // ...
}

class MyInterfaceImpl : MyInterface {
    // ...
}

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