в чем разница между java и kotlin
Kotlin vs Java
И снова здравствуйте. В преддверии старта нового курса «Backend-разработка на Kotlin», мы подготовили для вас перевод статьи, в которой рассказывается о том, чем же Kotlin отличается от Java.
«Kotlin – новый язык программирования, который заставит вас отказаться от Java». На европейской конференции Zebra APPFORUM 2017 в Праге наш Android-разработчик Питер Оттен вдохновлял других начать писать на Kotlin. Расстроены, что пропустили? Не переживайте! Питер расскажет вам, почему он стал большим поклонником этого языка.
Подъем
Так что же такое Kotlin?
Kotlin был впервые представлен в 2011 году, а в феврале 2016 года появилась его версия 1.0 stable release, затем 1.1 в марте. Язык программирования с открытым исходным кодом компилируется в JVM (Java Virtual Machine), Android и JavaScript. Таким образом, Kotlin может использоваться одновременно на JVM и Android-устройствах (интероперабельность). Также он может запускаться на фронтенде с помощью JavaScript. Google официально объявила на своей конференции I/O в мае, что Kotlin стал официально поддерживаемым языком для Android-разработки. С тех пор интерес к языку, его применение и сообщество выросли в разы.
По сравнению с Java
Для сравнения Java и Kotlin на презентации был приведен в пример класс POJO и то, как его можно использовать (рисунок выше). Здесь можно увидеть всю силу и лаконичность Kotlin, когда простой класс Person (с именем, геттером/сеттером и стандартными методами POJO) заменяется ключевым словом «data». Также, глядя на использование класса Person можно заметить следующие различия:
Выводы Mediaan об использовании Kotlin
После посещения других докладов о Kotlin на Droidcon в 2015 и 2016 в Лондоне и GDG DevFest 2016 в Амстердаме наша команда мобильных разработчиков решила, что пришло время взглянуть на новый язык. Мы начали использовать его в октябре 2016 года и просто влюбились в него. Первый новый проект под Android уже был на 100% написан на Kotlin. С тех пор мы не возвращались к Android-разработке на Java.
Теперь, когда мы оглядываемся назад, на наш опыт работы с Java, и видим то, как используется Kotlin сейчас, можно сделать следующие выводы:
Итак, начнете ли вы с Kotlin или перейдете на него?
Есть множество ссылок, которые помогут вам в его освоении:
Чтобы использовать Kotlin в уже существующем проекте или чтобы полностью перенести существующий проект на него, мы рекомендуем следующий подход:
О будущем
Помимо поддержки JVM, Android и JavaScript, Kotlin работает над поддержкой большего числа платформ. Поддержка машинного кода – это следующий большой шаг. Например, запустить код на RaspBerry Pi уже можно (в бета версии). Jetbrains работает над добавлением поддержки для iOS, MacOS и Windows. Это значит, что Kotlin может однажды стать основной нового кроссплатформенного решения для приложений. Больше информации о дальнейшем развитии вы сможете узнать на KotlinConf, их собственной конференции в конце этого года в Сан-Франциско.
Сравниваем Java и Kotlin
Предлагаю начать с общих черт.
Бесплатны и с открытым кодом
Код преобразуется в байт-код
Объектно-ориентированные языки программирования
1. Статическая типизация
Java и Kotlin являются языками со статической типизацией. Это означает, что проверка типов выполняется во время компиляции. (Существуют также языки с динамической типизацией, например PHP, Python и JavaScript.)
Это хорошо видно из примера ниже.
2. Бесплатны и с открытым кодом
Оба языка являются бесплатными и распространяются как открытое программное обеспечение (можно использовать без ограничений и участвовать в развитии).
3. Байт-код
Оба языка преобразуют код в байт-код, исполняемый JVM.
4. Интероперабельность
Оба языка являются интероперабельными. Это означает, что файлы Java и Kotlin могут сосуществовать в одном проекте или пакете JAR.
5. Поддержка ООП
Оба являются объектно-ориентированными языками программирования.
(Таким образом, они поддерживают основные концепции ООП)
Полиморфизм, наследование, инкапсуляция, абстракция.
А теперь рассмотрим основные отличия.
1. Представление публике и релиз
Язык Java был разработан компанией Sun Microsystems (в настоящее время принадлежит Oracle) в 1995 году.
Он поддерживается практически всеми типами устройств и операционных систем, будь то Android, Windows или Linux.
Язык Kotlin был представлен компанией JetBrains в 2011 году, выложен в открытый доступ в 2012 году, официально поддержан на Google I/O (ежегодном мероприятии разработчиков Google) в 2017 году.
По заявлению Google, 70 % из 1000 лучших приложений для Android сейчас написаны на Kotlin.
Некоторые приложения пока находятся в процессе переноса с Java на Kotlin, например приложение Google Home еще не полностью переписано на Kotlin.
. но по состоянию на июнь 2020 года около 30 % старой кодовой базы на Java уже было переписано на Kotlin.
Другими популярными примерами Kotlin-приложений от Google являются Maps, Play и Drive.
Прочие компании также выпустили множество приложений для Android, написанных на языке Kotlin.
Сейчас при поддержке разработки под Android компания Google придерживается стратегии «Kotlin прежде всего». Это в чем-то похоже на ситуацию с разработкой приложений под iOS, где произошел переход от Objective-C к Swift.
2. Версия
По состоянию на ноябрь 2020 года актуальной версией Kotlin является 1.4.0.
Несмотря на выход Java 15, самой популярной версией все еще остается Java 8 (или 1.8).
3. Скорость
По этому параметру Java превосходит Kotlin на 12–15 % для чистых сборок (то есть в этом случае Kotlin компилируется немного медленнее).
Однако в случае частичных сборок с включенной инкрементной компиляцией (то есть с компиляцией только небольших изменений) Kotlin компилируется так же быстро, как и Java, или даже немного быстрее.
4. Количество строк кода
Код, написанный на Kotlin, намного компактнее по сравнению с Java — на 30–40 %.
Таким образом, в теории размер приложений может уменьшиться на треть.
Язык Java — крайне многословный, а Kotlin — лаконичный и современный.
5. Доля рынка
По данным опросов, разработчиков на Kotlin примерно в пять раз меньше, чем использующих Java.
7,8 % разработчиков предпочитают Kotlin, более чем 40 % — Java. Однако эти опросы также показывают, что Kotlin нравится программистам больше, чем Java, и быстро наращивает аудиторию.
6. Безопасная работа с обнуляемыми переменными (null safety)
Java позволяет разработчикам присваивать значение null любой переменной.
Nullable-типы используются с оператором безопасного вызова.
7. Гибридные приложения
Kotlin можно использовать для написания нативных приложений для Android и iOS.
Kotlin Multiplatform Mobile (KMM) работает в Android и iOS.
Java до последнего времени не использовалась при разработке приложений под iOS.
Теперь рассмотрим СТИЛЕВЫЕ отличия.
Функция main
В Java метод main должен размещаться внутри класса. Он объявляется как статический метод.
В Kotlin, чтобы сделать функцию статической, достаточно поместить ее на уровень пакета. Так что это может быть самостоятельная функция без класса.
Аргументы метода main в Kotlin можно опустить, если наша программа не должна принимать аргументы командной строки.
В Java, если мы не включаем аргументы в функцию main (даже если мы их не используем), выводится ошибка.
2. Поведение по умолчанию
Чтобы разрешить переопределение метода, его необходимо явно пометить как open.
— это одно и то же в Kotlin.
Internal подразумевает повсеместную видимость в одном модуле.
Default обеспечивает видимость в пределах пакета.
Методы с модификатором default позволяют добавлять в интерфейсы новые функциональные возможности.
В Kotlin ключевое слово default не используется.
3. Типы данных и массивы
Изменяемым (mutable) и неизменяемым (immutable) типами в Kotlin являются var и val
В числовых литералах разрешается использовать символы подчеркивания.
Нельзя сравнивать типы разной величины.
Массивы объявляются следующим образом:
4. Списки
Тип List по умолчанию в Kotlin является неизменяемым, поэтому методы add() или remove() работают не так, как в Java.
5. Циклы
В заключение предлагаю рассмотреть функциональные различия.
Конструкторы
В Kotlin доступны два вида конструкторов.
Один из них прописывается после имени класса и называется первичным конструктором, а второй прописывается в теле класса и называется вторичным конструктором.
В классе могут быть один первичный конструктор и несколько вторичных.
Вторичный конструктор должен расширять поведение первичного конструктора.
2. Функции-расширения
Kotlin позволяет разработчикам расширять класс, добавляя новую функциональность при помощи функций-расширений.
Это поистине замечательное улучшение, поскольку программисту не требуется расширять класс.
По сути, функция-расширение — это функция, которая является членом класса, но определена за его пределами.
В Java функций-расширений не было.
3. Функции высшего порядка
В языке Kotlin функция, которая может принимать в качестве параметра функцию или лямбда-выражение или же может возвращать функцию, называется функцией высшего порядка (higher-order function).
4. Data-классы
В больших проектах, как правило, используется несколько классов, предназначенных исключительно для хранения данных.
Разработчику на Java приходится писать много стандартного, но часто встречающегося кода (так называемый шаблонный код или boilerplate ), data-классы в Kotlin позволяют избежать этих дополнительных усилий.
5. Статические члены
Ключевое слово static делает компонент частью класса, не связанной с объектом этого класса.
В концепции ООП то, что не является объектом, существовать не должно.
В Java статические члены обрабатываются не так, как члены-объекты. Это означает, что для статических членов нам недоступны такие вещи, как реализация интерфейса, помещение экземпляра в ассоциативный список (map) или передача его в качестве параметра методу, который принимает объект.
В Kotlin static не является ключевым словом и вместо статических членов используются объекты-компаньоны, позволяющие преодолеть вышеуказанные ограничения.
В этом и заключается преимущество.
Даже если члены объектов-компаньонов выглядят как статические члены в других языках, во время выполнения они все равно остаются членами экземпляров реальных объектов и могут, например, реализовывать интерфейсы.
6. Асинхронная обработка
В Java существует множество решений для асинхронной работы: RxJava, AsyncTask (уже официально не поддерживается), обработчики, обратные вызовы.
Корутины (или легковесные потоки) не являются отдельными потоками, но несколько корутин могут совместно использовать один поток.
7. Проверяемые исключения
8. Ленивая загрузка
В Kotlin модификаторы lateinit и by Lazy позволяют инициализировать значения до их фактического использования.
Оба варианта служат одной цели, но по факту сильно отличаются. Один является неизменяемым ( val ), другой — изменяемым ( var ).
Переменная lateinit может быть инициализирована из любого места, откуда доступен объект.
В свою очередь, Java не поддерживает отложенную инициализацию, поэтому значения инициализируются, даже если они не используются.
Вот некоторые различия между этими двумя мощными языками.
Благодарю за внимание!
Всех желающих приглашаем на открытый урок «Конструкторы и блоки инициализации». На занятии мы:
— Разберём конструктор на запчасти;
— Определим финалистов (финальные переменные);
— Наведём порядок (инициализации).
Kotlin vs Java: что лучше для Android-разработки?
Kotlin – это статически типизированный язык программирования, разработанный компанией JetBrains. Подобно языку Java, Kotlin стал отличным выбором для разработки приложений на Android. Это можно увидеть даже из того факта, что Android Studio поставляется со встроенной поддержкой Kotlin, как и с поддержкой Java.
Kotlin против Java
Итак, вопрос состоит в том, стоит ли разработчику переходить на Kotlin с Java или нет? Конечно это зависит от предпочтений разработчика. Однако, прежде чем переключаться, важно понять разницу между двумя языками программирования.
Проверяемые исключения
Одно из основных различий между Java и Kotlin заключается в том, что в последнем нет условий для проверяемых исключений (checked exception). Следовательно, нет необходимости отлавливать или объявлять какие-либо исключения.
Если разработчик, работающий на Java, считает, что использование кода try / catch в коде раздражает, то упущение, сделанное Kotlin, можно считать желанным изменением. Однако противоположностью будет, если разработчик считает, что проверяемые исключения нужны, способствуя восстановлению после ошибок и созданию надежного кода. В этом случае это можно считать для Kotlin плюсом и минусом, в зависимости от подхода к разработке.
Краткость кода
Сравнение класса Java с эквивалентным классом Kotlin демонстрирует лаконичность кода Kotlin. Для той же операции, что выполняется в классе Java, класс Kotlin требует меньше кода.
Расширения Kotlin в Android позволяют импортировать ссылку на View в файл Activity. Это дает возможность работать с этим представлением, как если бы оно было частью Activity.
Это явно можно отнести к плюсам Котлин.
Сопрограммы
Процессы, интенсивно загружающие процессор и сетевой ввод-вывод, обычно используют длительные операции. Вызывающий поток блокируется до завершения всей операции. Поскольку Android является однопоточным по умолчанию, пользовательский интерфейс приложения полностью блокируется, как только блокируется основной поток.
Kotlin также позволяет создавать дополнительные потоки. Тем не менее, есть лучший способ управления интенсивными операциями в Kotlin, известный как сопрограммы или корутины (coroutines). Корутины в Kotlin реализованы без стека, что означает, что они требуют меньшего использования памяти по сравнению с обычными потоками.
Корутины могут выполнять длительные и интенсивные задачи, приостанавливая выполнение, не блокируя поток, а затем возобновляя выполнение через некоторое время. Это позволяет создавать неблокирующий асинхронный код, который выглядит в работе как синхронный.
Код с использованием корутин не только понятен, но и лаконичен. Более того, корутины позволяют создавать элегантные дополнительные стили асинхронной неблокирующей разработки, такие как async / await.
Все это также явно относится к плюсам Котлина.
Классы данных
В полноразмерных проектах обычно есть несколько классов, предназначенных исключительно для хранения данных. Хотя эти классы практически не имеют функциональности, разработчику необходимо написать много стандартного кода на Java.
Тема связана со специальностями:
Обычно разработчик должен определить конструктор и несколько полей для хранения данных, функции геттеры и сеттеры для каждого из полей, а также функции equals(), hashCode() и toString().
Такое удобство создания классов, в вопросах для Kotlin «за и против», явно свидетельствует в его пользу.
Функции расширения
Kotlin позволяет разработчикам расширять класс новыми функциями с помощью функций расширения. Эти функции, хотя и доступны в других языках программирования, таких как C#, не доступны в Java.
Создать функцию расширения легко в Kotlin. Это делается путем добавления префикса к имени класса, который должен быть расширен до имени создаваемой функции. Чтобы вызвать функцию в экземплярах расширенного класса, нужно использовать нотацию «.»
Функции высшего порядка и лямбды
Все это просто означает, что функции могут работать всеми возможными способами во взаимодействии с другими нефункциональным значениям.
Как статически типизированный язык программирования, Kotlin использует ряд функциональных типов для представления функций. Более того, он поставляется с набором специализированных языковых конструкций, таких как лямбда-выражения.
Анонимные функции и лямбда-выражения также известны как функциональные литералы. Это функции, которые не объявлены, но передаются как выражения.
Неявные расширяющие преобразования
В Котлине нет поддержки неявных расширяющих преобразований для данных. Таким образом, меньшие типы не могут быть преобразованы в большие типы. В то время как Java поддерживает неявные преобразования, Kotlin требует выполнить именно явное преобразование.
Ряд разработчиков воспринимает это как минус Котлин.
Встроенные функции
Переменные, к которым осуществляется доступ в теле функции, называются замыканиями. Использование функций высшего порядка может существенно увеличить время выполнения вычислений. Каждая функция в Kotlin является объектом, и он захватывает замыкание.
И классы, и функторы требуют выделения памяти. Они, наряду с виртуальными вызовами, требуют определенных затрат на время выполнения. Таких дополнительных издержек можно избежать, вставив лямбда-выражения в Kotlin. Одним из таких примеров является функция lock().
В отличие от Kotlin, Java не обеспечивает поддержку встроенных функций. Тем не менее, компилятор Java способен выполнять встраивание с использованием метода final. Это так, потому что методы final не могут быть переопределены подклассами. Кроме того, вызов метода final разрешается во время компиляции.
Такие нововведения также воспринимаются как плюсы Котлина.
Встроенная поддержка делегирования
В терминологии программирования, Делегирование представляет собой процесс, в котором принимающий объект делегирует свои операции второму объекту делегата. Kotlin поддерживает шаблон проектирования композиция поверх наследования посредством делегирования первого класса, также известный как неявное делегирование.
Делегирование в Kotlin является альтернативой наследования. Этот механизм позволяет использовать множественное наследование. Кроме того, делегированные свойства Kotlin предотвращают дублирование кода.
Не-private поля
Инкапсуляция необходима в любой программе для достижения желаемого уровня управляемости.
Посредством инкапсуляции, представление объекта может быть установлено исходя из того, как вызывающие стороны взаимодействуют с ним. Кроме того, можно изменить представление без необходимости изменения вызывающих абонентов, если публичный API остается неизменным.
Видео курсы по схожей тематике:
Паттерны проектирования в Java
Асинхронное программирование в Java
Unit тестирование в Java с JUnit
Неприватные поля или public поля в Java полезны в сценариях, где вызывающие объекты должны меняться в соответствии с их представлением. Это означает, что такие поля предоставляют представление объекта вызывающим объектам. У Kotlin нет не-private полей.
Это достаточно интересное отличие при сравнении Kotlin и Java.
Нулевая безопасность
Одной из самых заметных проблем для разработчиков, связанных с Java, является NullPointerExceptions. Java позволяет разработчикам присвоить значение null любой переменной. Однако, если они пытаются использовать ссылку на объект с значением null, возникает исключение NullPointerException!
В отличие от Java, в Kotlin все типы по умолчанию являются не-nullable. Если разработчики попытаются присвоить или вернуть значение null в коде Kotlin, во время компиляции произойдет сбой. Тем не менее, есть способ обойти этот момент. Чтобы присвоить значение null переменной в Kotlin, необходимо явно пометить эту переменную как nullable. Это делается путем добавления знака вопроса после типа, например:
val number: Int? = null
Таким образом, в Kotlin нет исключений NullPointerException. Если вы встречаете такое исключение в Kotlin, то, скорее всего, вы либо явно присвоили значение null, либо это связано с каким-то внешним Java-кодом.
Примитивные типы
Существует 8 примитивных типов данных, включая char, double, float и int. В отличие от Kotlin, переменные примитивного типа не являются объектами в Java. Это означает, что они не являются объектами, созданными из класса или структуры.
Умные приведения
Прежде чем объект может быть приведен в Java, обязательно нужно проверить тип. Это также верно в сценариях, где очевидно нужно приводить объект.
В отличие от Java, Kotlin имеет функцию умного приведения, которая автоматически обрабатывает такие избыточные приведения. Вам не нужно выполнять приведение внутри оператора, если он уже проверен оператором is в Kotlin.
Статические Члены
В Kotlin нет статических элементов. Однако в языке программирования Java ключевое слово static отражает то, что конкретный член, с которым используется это ключевое слово, принадлежит самому типу, а не экземпляру этого типа.
Это просто означает, что один и только один экземпляр этого статического члена создается и используется всеми экземплярами класса.
Поддержка Конструкторов
Классы Kotlin, в отличие от классов Java, могут иметь один или несколько вторичных конструкторов, в дополнение к первичному конструктору. Это делается путем включения этих вторичных конструкторов в объявление класса.
Троичный оператор
В отличие от Kotlin, Java имеет тернарный оператор. Тернарный оператор в Java работает как базовый оператор if. Он состоит из условия, которое оценивается как истинное или ложное.
Кроме того, тернарный оператор в Java имеет два значения. Только одно из них возвращается в зависимости от того, является ли условие истинным или ложным. Синтаксис для тернарного оператора Java:
Типы подстановочных знаков
В общем коде, ‘ ?‘ представляет неизвестный тип. Этот символ известен как подстановочный знак. Существует несколько вариантов использования подстановочного знака, в том числе в качестве типа поля, локальной переменной или параметра.
Этого будет полезно учитывать при переходе с Java на Kotlin.
Библиотеки обработки аннотаций с Kotlin
Помимо предоставления поддержки существующим Java-фреймворкам и библиотекам, Kotlin также предлагает расширенные Java-фреймворки, основанные на обработке аннотаций.
Однако применение в Kotlin библиотеки Java, которая использует обработку аннотаций, требует добавления ее в проект Kotlin немного другим способом, чем требуется для библиотеки Java, которая не использует обработку аннотаций.
Требуется указать зависимость с помощью плагина kotlin—kapt. После этого необходимо использовать инструмент обработки аннотаций Kotlin вместо annotation Processor.
Независимо от всех различий между двумя языками программирования, они полностью совместимы. И Java, и Kotlin компилируются в байт-код. Это означает, что в вопросах «Kotlin vs Java» не будет однозначного ответа, ведь можно вызывать код Java из Kotlin и наоборот.
Бесплатные вебинары по схожей тематике:
Первоапрельские соревнования по программированию на C#, Java, C++, Pascal
Как стать Full-Stack разработчиком?
Типичные ошибки в коде на примере С++, С# и Java
Эта гибкость имеет два преимущества. Во-первых, это облегчает начало работы с Kotlin, постепенно добавляя код Kotlin в проект Java. Во-вторых, оба языка могут использоваться одновременно в любом проекте разработки приложений для Android.
Подводя итоги
Несмотря на значительные плюсы Kotlin, в вопросах разработки общего назначения Java одерживает верх. С другой стороны, все больше разработчиков и организаций внедряют Kotlin для быстрой разработки Android приложений.
И Java, и Kotlin имеют свои преимущества друг перед другом. Дискуссия о том, какой из них подходит для разработки лучше, только началась, и вряд ли она закончится в ближайшее время. Вопросы выбора: «почему Java?», «почему Kotlin?» все еще остаются. В любом случае переход с Java на Kotlin не будет болезненным.