Какие знаешь способы внедрения зависимостей

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

Ответ

В Android разработке основные способы DI:

  1. Ручное внедрение - простейший способ через конструктор или сеттеры:
class Car(private val engine: Engine) {
    fun start() = engine.start()
}
  1. Dagger/Hilt - популярные библиотеки для DI:
@Module
@InstallIn(ActivityComponent::class)
object CarModule {
    @Provides
    fun provideEngine(): Engine = PetrolEngine()
}
  1. Koin - легковесная DI-библиотека:
val appModule = module {
    single<Engine> { PetrolEngine() }
    factory { Car(get()) }
}
  1. Service Locator - антипаттерн, но иногда используется:
object ServiceLocator {
    fun getEngine(): Engine = PetrolEngine()
}

class Car {
    private val engine = ServiceLocator.getEngine()
}

Hilt сейчас рекомендуется Google как стандарт для Android. Ручное внедрение подходит для простых случаев, Koin - для небольших проектов.