Сводим Java c Kotlin: Interoperability | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
Team Lead Архитектура и шаблоны проектирования Разработчик IoT C# Developer. Professional PostgreSQL Подготовка к сертификации Oracle Java Programmer (OCAJP) C# ASP.NET Core разработчик
-5%
Kotlin Backend Developer
-8%
iOS Developer. Professional
-8%
Symfony Framework Unity Game Developer. Basic JavaScript Developer. Professional Android Developer. Basic JavaScript Developer. Basic Java Developer. Professional Highload Architect Reverse-Engineering. Professional Java Developer. Basic PHP Developer. Professional Алгоритмы и структуры данных Framework Laravel Cloud Solution Architecture Vue.js разработчик Интенсив «Оптимизация в Java» Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив "Tarantool" PHP Developer. Basic
Инфраструктура
Мониторинг и логирование: Zabbix, Prometheus, ELK Дизайн сетей ЦОД Разработчик IoT PostgreSQL Экспресс-курс "Версионирование и командная работа с помощью Git"
-30%
Экспресс-курс «Введение в непрерывную поставку на базе Docker» Базы данных Reverse-Engineering. Professional Administrator Linux. Professional Network engineer Cloud Solution Architecture Внедрение и работа в DevSecOps Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив «СУБД в высоконагруженных системах» Супер-интенсив "Tarantool" Network engineer. Basic
Корпоративные курсы
Безопасность веб-приложений IT-Recruiter Дизайн сетей ЦОД Компьютерное зрение Разработчик IoT Вебинар CERTIPORT Machine Learning. Professional
-6%
NoSQL Пентест. Практика тестирования на проникновение Java QA Engineer. Базовый курс Руководитель поддержки пользователей в IT
-8%
SRE практики и инструменты Cloud Solution Architecture Внедрение и работа в DevSecOps Супер-практикум по работе с протоколом BGP Infrastructure as a code Супер-практикум по использованию и настройке GIT Промышленный ML на больших данных Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes» BPMN: Моделирование бизнес-процессов Основы Windows Server
Специализации Курсы в разработке Подготовительные курсы Подписка
+7 499 938-92-02

Сводим Java c Kotlin: Interoperability

Предположим, что вы являетесь Android-разработчиком, который переходит на Kotlin и вы желаете зайти дальше уровня data-классов, планируя писать на Kotlin более сложные классы для фрагментов, активити, viewmodel-, interactor-, presenter-, repository- и прочих классов в зависимости от вашей архитектуры.

Допустим, в перспективе вы думаете полностью избавиться от Джавы в проекте. Все бы ничего, но сначала понадобится пройти довольно длинный путь устранения конфликтов между этими двумя языками.

Так как язык программирования Котлин изначально проектировался как JVM-язык, который полностью совместим с Java, вы без особых сложностей сможете наследоваться от существующих Джава-классов, а также обращаться к ним и использовать Java-аннотации к вашим методам и Kotlin-классам.

Но следует учесть, что есть несколько камней преткновения, которые образовались под влиянием, если можно так сказать, идеологических различий между 2-мя языками. О некоторых из них мы и поговорим.

GoingStatic

К примеру, в Kotlin отсутствует ключевое слово static, и с этим нужно просто смириться.

Но это не беда, ведь в нашем распоряжении есть companionobject. Речь идет о механизме объявления объекта внутри класса, причем этот механизм способен содержать внутри константы и методы, которые со стороны Джава будут синтаксически доступны, при этом в том же виде, как и статические поля либо Java-методы. Однако для того, чтобы при компиляции сгенерировались и статический метод класса, в котором, кстати, находится этот объект, да и метод этого объекта сам по себе, следует пометить его как @JvmStatic (по дефолту без этой аннотации метод companion-объекта является доступным посредством ссылки на Companion-инстанс).

Тему companionobjects, а также вопросы создания синглтонов и objectexpressions в Котлин подробно раскрывает вот эта страница документации.

Однако прежде, чем вы заключите ваши константы в companionobject-ы по всему проекту, учтите, что такие объекты не так уж дешевы, как это может показаться. Именно поэтому всем, кто планирует переходить на Котлин, рекомендуется ознакомиться с блоком статей «Kotlin’shiddencosts» (part 1, part 2, part 3). Эти статьи открывают обратную сторону синтаксического сахара с точки зрения байткода. Особое внимание следует обратить на советы по применению inline-функций для оптимизации производительности лямбда-выражений. Представляют интерес и рекомендации относительно того, как избежать избыточность автоупаковки/автораспаковки «под капотом».

Коллекции

Если мы говорим о коллекциях, то тут Kotlin полностью полагается на классы стандартной Java-библиотеки, расширяя их возможности посредством дополнительных функций для объявления (listOf(), mapOf(), etc), а также их модификаций и преобразований. Вообще, они относительно часто оказываются полезны и удобны в применении, поэтому с коллекциями в Kotlin в целом все неплохо и довольно прозрачно. По крайней мере, почти…

Также обратите внимание, что List, Map и Set являются алиасами для неизменяемых JDK-реализаций коллекций, а попытки поменять их содержимое обернутся UnsupportedOperationException, что, в принципе, логично.

Generics

Обобщения в Котлин тоже поддерживаются, однако есть важные различия в их реализации между 2-мя языками. Пренебрежение этими различиями способно привести вас к непредвиденным конфузным ситуациям. Вообще, эта разница подробно описана в документации и во многих тематических статьях. Вот некоторые материалы, неплохо раскрывающие ключевые для дженериков концепции ковариантности, инвариантности и контравариантности: • https://kotlinlang.org/docs/reference/generics.html; • https://proandroiddev.com/understanding-generics-and-variance-in-kotlin-714c14564c47; • https://typealias.com/guides/illustrated-guide-covariance-contravariance/.

Источник

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться