IO — Ivan Labs

Миграция существующей кодовой базы Java на Kotlin без поломки всего

3 мин чтения
AndroidKotlinJava

Соблазн при миграции Java-в-Kotlin — спланировать полное переписывание. Реалистичный, менее рискованный путь почти всегда поэтапный.

Почему полное переписывание обычно неправильный выбор

Переписывание рабочей, протестированной кодовой базы с нуля сбрасывает покрытие тестами и повторно вносит баги, уже исправленные однажды. Если существующий код реально не необслуживаем, поэтапная миграция сохраняет то, что уже работает, постепенно получая выгоды Kotlin.

Поэтапный подход

  1. Новый код пишется на Kotlin с первого дня. Никаких новых Java-файлов, начиная с сейчас — уже одно это означает, что доля Java со временем только сжимается, никогда не растёт.
  2. Конвертируйте файлы, которые вы уже трогаете. Когда вы всё равно в Java-файле ради багфикса или маленькой фичи, конвертируйте его как часть того же изменения — стоимость уже оплачивается временем ревью/тестирования, так что дополнительная стоимость конвертации низкая.
  3. Используйте встроенный конвертер Android Studio как отправную точку, а не финишную черту. Он достаточно хорошо справляется с механическим переводом, но часто производит Kotlin, технически корректный, но не идиоматичный — platform types, ненужные null-проверки и Java-стиль многословности — частый вывод, который стоит почистить.
  4. Оставьте стабильные, редко трогаемые файлы в покое. Конвертация рабочего кода, который никому не нужно изменять, добавляет риск (новые баги, накладные расходы на ревью) без практической выгоды — это наименее ценная часть миграции, а не самая ценная.

Вопрос nullability — реальная работа

У Java нет null-безопасности на этапе компиляции, так что сконвертированный файл обычно оказывается полон platform types (типов, для которых Kotlin не может проверить null-безопасность, потому что исходник Java не давал такой гарантии) или защитных утверждений !!. Реальная ценность null-безопасности Kotlin проявляется только тогда, когда кто-то намеренно возвращается и ужесточает их до настоящих nullable/non-null типов на основе реального знания поведения кода — автоконвертер не может это вывести, только человек, знакомый с логикой.

// Автоконвертировано, технически работает, но не целевое состояние:
fun getUserName(user: User?): String {
    return user!!.name
}
 
// После намеренной очистки, реальная выгода миграции:
fun getUserName(user: User?): String {
    return user?.name ?: "Unknown"
}

Интероп работает в обе стороны

Класс Kotlin может наследоваться от класса Java, и наоборот, в одном модуле, без какой-либо специальной настройки — именно это делает подход файл-за-файлом реалистичным, а не теоретическим. Не нужен изолированный «модуль Kotlin» для начала; существующий Java и новый Kotlin код сосуществуют напрямую.

Разумный порядок миграции

ПриоритетЧто конвертировать первым
ВысокийФайлы, активно изменяемые по другим причинам
СреднийМаленькие, самодостаточные утилитарные классы (низкий риск, быстрые победы)
НизкийБольшие, стабильные, редко трогаемые файлы — часто вообще не стоит конвертировать

О более широком аргументе «почему Kotlin» за пределами механики миграции см. наше сравнение Kotlin против Java.

Частые вопросы

Нужно ли конвертировать всю кодовую базу сразу?

Нет — Kotlin и Java напрямую взаимодействуют в одном модуле, так что файлы можно конвертировать по отдельности со временем без переписывания «одним махом».

Инструмент автоконвертации Android Studio реально хорошо работает?

Для простых файлов — да, и это разумная отправная точка — но он часто производит многословный или неидиоматичный Kotlin, выигрывающий от ручной очистки впоследствии, особенно вокруг аннотаций nullability.

Какая часть миграции Java-в-Kotlin самая рискованная?

Предположения о nullability — у Java нет null-безопасности на этапе компиляции, так что сконвертированный код часто оказывается полон platform types и защитных утверждений `!!`, пока кто-то намеренно не ужесточит типы, и именно там реально проявляется настоящая выгода миграции.

Нужна помощь с этим?

Свяжитесь со мной, и я помогу разобраться.

Связаться со мной

Похожие статьи

Поделиться:X / TwitterLinkedIn