← Назад к вопросам

Что такое @Binds?

1.7 Middle🔥 191 комментариев
#Dependency Injection#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

@Binds — аннотация для связывания интерфейсов в Dagger

@Binds — это аннотация в Dagger, которая используется для связывания интерфейса с его конкретной реализацией в модуле dependency injection. Это более эффективная альтернатива методам @Provides, когда нужно просто перенаправить зависимость от интерфейса к конкретной реализации.

Основной синтаксис

@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {
    @Binds
    abstract fun bindUserRepository(impl: UserRepositoryImpl): UserRepository
}

Как это работает

@Binds vs @Provides:

  • @Binds — просто связывает интерфейс с реализацией (no-op)
  • @Provides — используется когда нужна логика создания объекта

Преимущества @Binds:

  • Меньше generated кода (Dagger оптимизирует)
  • Быстрее работает
  • Проще читается
  • Не требует создания объекта через конструктор

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

// Интерфейс
interface LoggingService {
    fun log(message: String)
}

// Реализация
class AndroidLoggingService @Inject constructor() : LoggingService {
    override fun log(message: String) {
        Log.d("App", message)
    }
}

// Модуль Dagger
@Module
@InstallIn(SingletonComponent::class)
abstract class LoggingModule {
    @Binds
    abstract fun bindLoggingService(impl: AndroidLoggingService): LoggingService
}

// Использование
class MyViewModel @Inject constructor(
    private val logger: LoggingService  // Получим AndroidLoggingService
) : ViewModel() {
    fun doSomething() {
        logger.log("Что-то происходит")
    }
}

Когда использовать @Binds

Используй @Binds когда:

  • Есть интерфейс и одна конкретная реализация
  • Не нужна сложная логика создания
  • Хочешь чистый и быстрый код

Используй @Provides когда:

  • Нужна сложная логика инициализации
  • Требуется конфигурация объекта
  • Создаёшь объект из встроенных типов

Множественные реализации

@Module
@InstallIn(SingletonComponent::class)
abstract class AnalyticsModule {
    @Binds
    @Singleton
    abstract fun bindAnalytics(impl: FirebaseAnalytics): Analytics
}

// Если нужны разные реализации для разных сценариев
// используй @Qualifier

Важные моменты

  • Метод должен быть abstract — это обязательно
  • Параметр = реализация — Dagger сам найдёт конструктор
  • Возвращаемый тип = интерфейс — то, что инжектируем
  • Работает с @Inject конструкторами — реализация должна иметь @Inject
  • Scopes поддерживаются — @Singleton, @ActivityScoped и т.д.

@Binds — один из столпов правильной архитектуры в Android, позволяющий легко менять реализации без изменения кода, который их использует.

Что такое @Binds? | PrepBro