Ответ вслух Middle Java-интероп обновлено

Kotlin и Java в одном проекте

Вопрос

Расскажи, на что обращать внимание, когда Kotlin и Java живут в одном проекте.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Самая частая проблема на стыке это null. Значения из Java без аннотаций приходят как платформенные типы, и компилятор Kotlin их не проверяет.

Что должно прозвучать в ответе

  • Платформенные типы: аннотации 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 ошибок.

Термины по теме