Подавляющее большинство программистов на вопрос, на каком языке пишут приложения для Android, даст один из двух вариантов ответа: Java или Kotlin. В этом нет ничего удивительного, если учесть простой и очевидный факт. Именно эти два языка являются официальными и поддерживаются компанией Google – разработчиком операционной системы Android. Как и основной платформой для программирования для этой ОС – Android Studio. Поэтому сравнение языков выглядит вполне логичным. Рассмотрим противостояние Kotlin vs Java более внимательно.
Первым делом необходимо дать некоторые общие сведения о каждом из языков программирования. Целесообразно начать с более «старшего».
Java относится к типизированным и объектно-ориентированным языкам программирования. Создан одним из первых – в 1995 году – компанией Sun Microsystem, позднее приобретен одной из крупнейших IT-корпораций Oracle. Язык является универсальным, так как используется для написания разнообразных клиентских и серверных приложений. Но основным направлением применения многие специалисты считают создание ПО для Android. До 2017 года был единственным языком, официально поддерживаемым Google и сервисом компании Android Studio.
Kotlin также относится к типизированным и объектно-ориентированным языкам программирования. В этом нет ничего удивительного, так как он работает поверх JVM (Java Virtual Machine), которая является основной частью исполнительной системы Java. Поэтому с некоторой долей условности Kotlin можно назвать надстройкой над Java.
Язык появился в 2011 году, а в 2017 получил официальный статус от компании Google в качестве инструмента для работы на Android Studio. Что стало основанием для длительных разбирательств между Google и Oracle, чьи интересы, как владельца бренда Java, были затронуты таким решением.
Разработчики Kotlin, как и специалисты Google, декларируют множество преимуществ этого языка программирования над Java. На официальном сайте операционной системы Андроид приводятся следующие плюсы Kotlin:
Но даже активная поддержка со стороны Google не привела к потере лидирующих позиций Java. Именно этот язык продолжает использовать большая часть разработчиков, что позволяет ему входить в топ-5 (часто – в топ-3) любых опросов среди программистов. Kotlin обычно занимает места ниже 10-го, а иногда и не входит в топ-20.
Поэтому на вынесенный в подзаголовок вопрос можно ответить однозначно: намного чаще на Java. Важно понимать, что такой перевес достигается в значительной степени за счет простых и средних по сложности приложений. Это объясняется тем, что серьезные профессионалы в программировании для Android все активнее используют именно Kotlin. Но в пользу Java сказывается намного более длительная история и огромное число приложений, написанных ранее.
Но нужно сделать одну важную оговорку. Java так сильно доминирует над Kotlin не из-за каких-то своих положительных качеств, а из-за легаси. До появления Kotlin все повально писали код на Java, и с появлением Kotlin они, естественно, не стали переходить на новый язык – пришлось бы переписывать весь код и перекапывать всю архитектуру. А раз старые приложения продолжают писать на Java – значит, спрос на джавистов намного больше, чем на Kotlin-разработчиков. А раз джавистов – больше, то и новые приложения чаще пишутся на Java, потому что у джавистов нет времени/желания изучать Kotlin. Формируется порочный круг, который медленно разрывают стартапы, не имеющие легаси по определению. Поэтому не стоит отдавать предпочтение Java только потому, что ее больше на рынке – Java-разработчиков на рынке тоже больше, то есть вы столкнетесь с более серьезной конкуренцией.
Оба языка программирования являются универсальными и хорошо дополняют друг друга. Считать, что они используются исключительно для Android-разработки, в корне неверно. Напротив, каждый из языков имеет намного большую сферу практического применения. Применительно к Java она включает:
Область использования Kotlin не менее обширна и включает:
Язык Java активно применяется в работе сайтов практически всех ведущих корпораций мира. Как было отмечено, он продолжает оставаться намного более популярным, чем конкурент. Но после 2017 года многие из них, например, Twitter, Netflix и сам Google, часть проектов и сервисов переводят на Kotlin.
Предсказать дальнейшее развитие событий и итоговый результат конкурентной борьбы между схожими языками программирования достаточно сложно.
Что не делает невозможным их сравнение по наиболее важным критериям, приведенное в таблице.
Критерий сравнения | Язык программирования | |
Java | Kotlin | |
Возраст | Около 27 лет. Java намного старше, что является одним из ключевых аргументов в его пользу | Примерно 11 лет. Заметно уступает конкуренту по этому параметру |
Объем кода | Сравнительно большой, заметно более громоздкий, чем у Kotlin | Краткий и лаконичный. Один из самых простых в написании |
Безопасность | Относительно невысокая | Высокая, предусматривающая встроенную опцию null-безопасности |
Среда программирования | Одинаковая для обоих языков разработки ПО – Android Studio | |
Цели создания ПО | Преимущественно поддержка старых продуктов, написание простых приложений | Разработка нового и сложного программного обеспечения с длительным сроком использования |
Комьюнити | Намного многочисленнее, с большим количеством форумов, тематических сайтов и методических ресурсов | Находится на стадии активного формирования, уступает по численности и имеющимся ресурсам |
Доля рынка Android | По разным данным – в диапазоне 75-85% | По разным данным – в диапазоне 15-25% |
Запросы работодателей | Входит в число обязательных требований по большинству вакансий | Выступает необходимым требованием далеко не всегда, но очень часто – при наборе в самые серьезные IT-компании |
Перспективы | Сохраняются хорошими из-за огромного количества приложений, созданных с помощью Java. Переписать их все на Kotlin или другие языки программирования попросту невозможно | Выглядят несколько предпочтительнее, в том числе – за счет очевидной поддержки Google |
Несмотря на родство, языки довольно ощутимо отличаются друг от друга в мелочах, и обычно эти мелочи делают жизнь программистов на Kotlin более удобной.
Первый пример различия – это null по ссылке. В Java можно без проблем написать:
String new_string = “Hello world”;
new_string = null;
Ссылка указывала на строку, одна строчка кода – и ссылка уже никуда не указывает. И это – ужасный дизайн, потому что одна упущенная ссылка может сломать все приложение, и искать баг вы будете очень долго. Kotlin позволяет вам делать ссылки, которые не могут быть null:
var foo: String = "Hello World!"
foo = null // compilation error
var bar: String? = "This is nullable"
bar = null // okay
Если вы создали простую ссылку – она в принудительном порядке должна указывать на строку. Хотите сделать так, чтобы ссылка могла быть null – поставьте специальный оператор «?».
Оператор Switch в Java выглядит крайне громоздким и неудобным:
public class Calculator {
public static double calculate (double a, String op, double b) throws Exception {
switch (op) {
case "plus":
return a+b;
case "minus":
return a-b;
case "div":
return a/b;
case "times":
return a*b;
default:
throw new Exception();
}
}
}
В Kotlin его существенно оптимизировали:
fun calculate(a: Double, op: String, b: Double): Double = when (op) {
"plus" -> a + b
"minus" -> a - b
"div" -> a / b
"times" -> a * b
else -> throw Exception()
}
Создание классов в Java – это ад, потому что нужно переопределить как минимум 3 метода класса Object (toString(), equals() и hashCode()), для каждого поля нужно добавить геттеры и сеттеры:
public class Person {
private String name;
private String email;
private int age;
public Person(String name, String email, int age) {
this.name = name;
this.email = email;
this.age = age;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
public int getAge() {
return age;
}
@Override
public String toString() {
//переопределение
}
@Override
public int hashCode() {
//переопределение
}
@Override
public boolean equals(Object obj) {
//переопределение
}
}
При этом в 99% случаев переопределение – настолько стандартное, что IDE все сама делает за вас. В Kotlin весь код выше (и это – сокращениями) умещается в одну строку:
data class Person(val name: String, val email: String, val age: Int)
Kotlin может дополнить функционал класса «на лету»:
fun String.greeting(): String = "Hi there!"
fun main() {
val foo = "DaString"
val bar = foo.greeting() // "Hi there!"
}
Java так не умеет, совсем.
Kotlin заимствовал от Python возможность объявлять функциональность вне классов:
fun foo(): String = "Hi there!"
class SomethingRandom {
fun bar(): String = "Hi there!"
}
Это позволяет вам писать функционал в зависимости от своих потребностей, а не в зависимости от навязываемых языком правил. Java же жестко навязывает правила игры: ничего вне класса описать нельзя.
Увы, в Kotlin его нет, поэтому приходится изобретать велосипеды:
val foo = if (bar == 1) getMessage() else "Hi there!"
Java заставляет вам перехватывать все выкидываемые кодом исключения, в то время как Kotlin позволяет вам не обрабатывать исключения вовсе – тогда их будет выкидывать через весь стэк вызовов по стандартному протоколу. Это однозначно можно назвать минусом – если вы сами выкидываете где-то в коде исключение, вы должны его как-то обработать, а если кода для обработки нет – значит, вы забыли его написать (и обнаружите вы это только тогда, когда приложение крашнется).
Большая часть специалистов ответит на этот вопрос достаточно просто: сначала имеет смысл освоить Java в качестве базы. Только после этого целесообразно переходить к изучению Kotlin, что позволит повысить уровень профессиональной подготовки и станет важным плюсом в глазах работодателя.
Обратный порядок освоения языков программирования вряд ли окажется эффективным. Он возможен только в том случае, если обучение ведется с опытным наставником и направлено на решение четко поставленной задачи.
Например, реализации определенного проекта, где требуется исключительно знание Kotlin и его окажется достаточно.
На это существует, как минимум, три веских причины. Первая и главная – языки являются прямыми конкурентами в разработке приложений для Android, а это один из самых больших сегментов рынка ПО. Вторая – признание Google обоих языков в качестве официальных для Android Studio. Третья – создание Kotlin фактически на базе Java.
Главные из них состоят в следующем: более длительная история, большое число разработанных приложений и подготовленных специалистов, многочисленное профессиональное комьюнити со всеми вытекающими отсюда последствиями в виде тематических интернет-ресурсов и форумов.
Язык программирования проще, компактнее и безопаснее. Он заметно удобнее в работе и позволяет создать более производительные приложения.
Java остается намного более востребованным и широко применяемым языком программирования.
У каждого из них хорошие перспективы. Хотя Kotlin выглядит несколько предпочтительнее, прежде всего – из-за разносторонней поддержки от Google.