Какие минусы у Koin и почему его не стоит использовать?
Что проверяют
Понимаете ли вы, как Koin устроен внутри, и отличаете ли реальные минусы от пересказанных мифов. Формулировка «почему не стоит» провокационная: сильный ответ не соглашается с ней целиком, а называет условия. Следом обычно просят сравнить с Hilt.
Как отвечать
Сначала механика. Koin это DSL поверх контейнера: зависимости регистрируются лямбдами (single, factory, viewModel) и находятся по типу в момент запроса. Кодогенерации нет, граф разрешается в рантайме. Отсюда реальные минусы:
- ошибки графа в рантайме: забытое определение даёт
NoDefinitionFoundExceptionтолько при первом обращении, возможно в редком сценарии на проде. У Dagger и Hilt такая ошибка ломает сборку. Смягчают это тестом сverify()для модулей или Koin Annotations с проверкой конфигурации при компиляции; - сервис-локатор:
by inject()иget()внутри класса прячут зависимости, а класс сKoinComponentзавязан на фреймворк и хуже тестируется. Лучше внедрять через конструктор и держатьget()только в модулях; - стоимость разрешения: каждый
get()это поиск в реестре во время работы. На большом графе это видно на холодном старте, поэтому стоит мерить, а не верить на слово; - глобальное состояние:
startKoinподнимает общий контекст, и в тестах его нужно явно останавливать, иначе модули протекают между тестами; - ручные скоупы и квалификаторы:
named("...")строками и собственные скоупы легко рассинхронизировать.
Назовите и плюсы: быстрая сборка без kapt и KSP, низкий порог входа, поддержка Kotlin Multiplatform и Compose. Hilt работает только на Android, поэтому в KMP-проекте Koin часто выбирают осознанно.
Где спотыкаются
Говорят, что Koin медленный из-за рефлексии. Рефлексии в основе Koin нет, есть поиск по типу в рантайме, это другой источник накладных расходов.
Утверждают, что Koin не типобезопасен. Типы проверяет компилятор Kotlin, а вот полноту графа до запуска никто не проверяет, это разные вещи.
Отвечают категорично «Koin для маленьких проектов». Правильнее назвать условия: большая команда, огромный граф и жёсткие требования к старту говорят в пользу Hilt, а мультиплатформа и скорость сборки в пользу Koin.