В чем разница между Service Locator и DI

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

Ответ

Service Locator и Dependency Injection (DI) — оба подхода для управления зависимостями, но работают по-разному.

Service Locator — это контейнер, который предоставляет зависимости по запросу (через явный вызов). Клиентский код сам запрашивает нужный сервис.
Пример:

val service = ServiceLocator.getService<MyService>()

DI — зависимости передаются в класс извне (через конструктор, методы или поля). Класс не знает, как их получить.
Пример:

class MyViewModel(private val repo: MyRepository) { ... }

Ключевые отличия:

  1. Явность — Service Locator скрывает зависимости (их сложнее отследить), DI делает их явными.
  2. Тестируемость — DI упрощает мокирование, так как зависимости легко подменить.
  3. Инверсия управления — DI строже следует принципу IoC.

Вывод: DI предпочтительнее из-за прозрачности и тестируемости, но Service Locator иногда удобен для legacy-кода.