Kotlin и Java в одном проекте
Вопрос
Расскажи, на что обращать внимание, когда Kotlin и Java живут в одном проекте.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Платформенные типы: аннотации nullability в Java-коде
Аннотации для Java-клиентов: JvmStatic, JvmOverloads, JvmField, Throws
Checked-исключения: Kotlin их не объявляет
Read-only коллекции не защищают от Java
suspend-функции нужны обёртки для Java
Сборка: kapt медленный, переход на KSP
Что могут спросить следом
- Как постепенно мигрировать Java-модуль на Kotlin?
- Что такое JSpecify?
- Почему Lombok плохо дружит с Kotlin?
Разбор
Самая частая проблема на стыке это null. Значения из Java без аннотаций приходят как платформенные типы, и компилятор Kotlin их не проверяет. Поэтому Java-код, к которому обращается Kotlin, стоит разметить аннотациями nullability, сейчас стандартом становится JSpecify, а AndroidX уже размечен. В обратную сторону Kotlin-код надо сделать удобным для Java: @JvmStatic для методов companion, @JvmOverloads для параметров по умолчанию, @JvmField для констант-объектов, @file:JvmName для утилит, и @Throws, потому что Kotlin не объявляет checked-исключения, и Java не сможет их поймать. Read-only коллекции Kotlin для Java обычные изменяемые списки, поэтому наружу отдаю копии. Suspend-функции для Java оборачиваю в CompletableFuture. На уровне сборки слежу за обработкой аннотаций: kapt медленный, по возможности переходим на KSP. Мигрирую постепенно: новые файлы на Kotlin, старые переписываю при серьёзных изменениях, начиная с моделей и утилит.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.