← Назад к вопросам
Что такое @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, позволяющий легко менять реализации без изменения кода, который их использует.