Рубрики
Без рубрики

Котлин против Scala: Что я должен выбрать вместо Java?

С новостью о том, что это официально поддерживаемый язык для разработки Android, Kotlin привлек большое внимание. Однако, если вы планируете отказаться от Java, вы должны знать, что Kotlin-не единственный ваш вариант.

Автор оригинала: Jessica Thornsby.

С новостью о том, что Kotlin теперь официально поддерживается языком для разработки Android, в последнее время языку программирования JetBrains уделяется много внимания — настолько много, что многие разработчики Java задаются вопросом, следует ли им переходить на Kotlin.

Однако, если вы планируете отказаться от Java, вы должны знать, что Kotlin-это не ваш единственный вариант.

В этой статье мы рассмотрим все основные различия между Kotlin и Scala — языком, который заимствует Котлин.

Мы рассмотрим некоторые фундаментальные различия между Scala и Kotlin, такие как их подход к совместимости с Java и уровень поддержки сообщества, доступный для каждого языка, прежде чем углубиться в технические различия на уровне языков между ними.

К концу этой статьи у вас будет вся информация, необходимая для того, чтобы решить, является ли Scala или Kotlin лучшим “альтернативным” языком виртуальной машины Java (JVM) для вас.

Примечание : Хотя эта статья предназначена для разработчиков, которые рассматривают возможность ухода от Java, она также содержит много информации, которая будет полезна для любых разработчиков Scala, которым может быть интересно, может ли Kotlin что-нибудь предложить им.

Что вы ищете в своем следующем языке программирования?

Хотя оба они широко считаются альтернативами Java, у Scala и Kotlin очень разные подходы к “улучшению” Java.

Kotlin стремится улучшить Java, сократив стандартный код и введя некоторые функции, которых катастрофически не хватает Java, такие как безопасный дизайн с нулевым значением.

Напротив, Scala спроектирована так, чтобы отличаться от Java, с гибким синтаксисом, на который в большей степени влияют концепции функционального программирования. Java 8, возможно, и ввела множество функциональных функций программирования, но это все еще очень императивный язык. Это делает Scala идеальным решением для ситуаций, когда вы хотите использовать переносимость JVM “запись один раз выполняется везде” при написании кода в более функциональном стиле. Сочетание объектно-ориентированных и функциональных программных конструкций Scala также делает его подходящим для любых проектов, в которых вы хотите объединить эти два стиля программирования.

Кроме того, Scala включает функции, которые вы не найдете ни в Kotlin, ни в Java, такие как полная поддержка сопоставления шаблонов, макросов и типов более высокого уровня, что делает Scala идеальным решением для задач обработки больших данных, таких как анализ графиков, вычисления агрегации и сложное математически ориентированное моделирование (например, медицинское моделирование). Если вы специалист по обработке данных, который регулярно имеет дело с большими наборами данных, то вы можете счесть бесценными более продвинутые функции Scala , поддержку параллелизма и тесную связь с механизмом обработки данных Apache Spark .

Как вы увидите в этой статье, является ли Scala или Kotlin лучшим выбором для вас, во многом зависит от того, что вы ищете: язык, который стремится быть лучшей версией Java, или язык, который позволяет вам делать то, что невозможно в Java.

Вы можете взглянуть на это по-другому: почему вы вообще хотите уйти с Java? Если вы довольны Java в целом, но разочарованы ее многословием, то Kotlin может быть именно тем, что вы ищете. Если вам надоел набор функций и ограничений Java, переход на Scala может иметь больше смысла.

Насколько легко выучить каждый язык?

Поскольку Scala обладает множеством мощных, расширенных функций и гибким синтаксисом, неудивительно, что это не самый простой язык для изучения и может пугать новичков.

Напротив, многие разработчики Java, которые перешли на Kotlin, хвалят то, насколько легко его освоить. Некоторые организации сообщили, что их разработчики Java смогли освоить базовый синтаксис Kolin всего за несколько часов и начали писать код Kotlin примерно за один-три дня.

Однако то, что язык легче усвоить, автоматически не делает его лучше . Возможно, Kotlin считается самым простым языком для изучения, но если в нем нет всех необходимых функций, то те несколько часов, потраченных на ознакомление с синтаксисом Kotlin, были временем, которое вы могли бы потратить на изучение языка, который действительно предоставляет вам необходимые функции.

Совместимость с Java

Переключение с одного языка на другой не всегда является чистым разрывом — у вас может быть устаревший код, который вам необходимо продолжать поддерживать, или текущие проекты Java, которые вы предпочли бы не сразу переводить на новый язык.

Как Scala, так и Kotlin совместимы с Java. Однако, если обстоятельства требуют, чтобы вы поддерживали полную совместимость с существующими технологиями или проектами на основе Java, у Kotlin есть преимущество, поскольку он спроектирован так, чтобы быть на 100% совместимым с Java. Вы можете легко вызвать код Kotlin с Java и код Java с Kotlin без каких-либо проблем. Если вы хотите использовать Kotlin для разработки на стороне сервера, вы можете использовать существующие платформы на основе Java, такие как Java Server Faces (JSF) или фреймворк реактивного веб-приложения “Vert.x”.

Хотя у вас не должно быть проблем с доступом к классам Java из кода Scala, вы можете столкнуться с проблемами при попытке вызова классов Scala из Java, если вы используете некоторые из более продвинутых функций Scala, поскольку они часто не имеют эквивалента Java.

Ресурсы и поддержка сообщества

JetBrains представила Kotlin в 2011 году, а Scala впервые появилась на публике в 2004 году.

Оба языка имеют довольно подробную документацию, но, как более новый язык, Kotlin имеет значительно меньше ресурсов сообщества с точки зрения собственных библиотек, сообщений в блогах и учебных пособий. На самом деле, если вы выполните поиск по переполнению стека вопросов и ответов разработчиков, вы найдете только 3,8 тыс. вопросов с тегами Kotlin по сравнению с более чем 68,5 Тыс. вопросов с тегами Scala .

Если вам действительно нужна информация, которая не включена в официальные документы, вам может быть гораздо труднее найти ее в данный момент, если вы выберете в качестве следующего языка JVM язык Kotlin, а не Scala.

Котлин официально поддерживается в Android

Ни одна статья в Kotlin не была бы полной, по крайней мере, без упоминания того факта, что Kotlin недавно стал официально поддерживаемым языком для разработки Android.

Если вы ищете новый язык JVM для своей работы на Android, трудно не рекомендовать Kotlin. В Android Studio 3.0 Preview и выше создать проект с поддержкой Kotlin так же просто, как установить флажок в мастере создания проекта. Кроме того, есть несколько функций, которые делают Kotlin особенно подходящим для разработки на Android:

Функции расширения : Здесь вы добавляете новую функциональность в существующий класс. В контексте приложений для Android функции расширения особенно полезны для предоставления группам просмотра возможности раздувать себя. Расширения Kotlin для Android : Эта функция позволяет импортировать ссылку на представление в действие, что может привести к тому, что весь этот шаблонный код findViewById уйдет в прошлое.

Хотя плагин Android SDK для SBT существует, его необходимо добавить в среду разработки, и он официально не поддерживается Android Studio.

Нулевой дизайн против оператор опции

Теперь мы переходим к различиям на уровне языка. Одно из самых больших различий между Scala и Kotlin заключается в том, как они обрабатывают null.

Подавляющее большинство разработчиков Java будут хорошо знакомы с Исключением Nullpointerexception (НПЭ). Хотя аннотации Java 8 @NonNull действительно помогают облегчить некоторую боль, причиняемую NPE, null остается огромным источником разочарования для разработчиков Java.

Scala использует монадический подход к нулю, заменяя нулевые значения на Параметр , который является собственным типом Scala для представления значений, которые могут существовать или не существовать. Опция может либо не содержать значения (Нет), либо содержать одно значение, которое представлено как Некоторое[значение правильного типа] .

Давайте представим, что у вас есть метод, который возвращает адрес из базы данных:

def findAddress(key: Int): Option[Address]

Если запись найдена, то этот метод вернет Некоторые[Адреса] . Если запись не найдена, она не вернет ничего.

Недостатком этого подхода является то, что он действительно усложняет ваш код, так как вам необходимо явно использовать опцию. Кроме того, значение null все еще присутствует в Scala, потому что val x: является совершенно допустимым. С положительной стороны, вы можете применить другие методы к значению вашего параметра, чтобы у вас было больше гибкости в том, как вы обрабатываете потенциальные значения None/null.

Напротив, Kotlin отказывается компилировать код, который присваивает или возвращает нулевое значение. Например, следующее не будет компилироваться:

val name: String = null
john getName() : String = null

Это не добавляет никакой сложности вашему коду и делает практически невозможным обнаружение NPE в Kotlin, хотя вы все равно можете столкнуться с NPE из внешнего кода Java.

Перегрузка оператора

Перегрузка операторов-это когда вы переопределяете поведение оператора для определенного типа, позволяя создавать пользовательские реализации различных операторов.

Хотя вы не найдете эту функцию в Java (хотя обработка Java + для строк довольно близка), как Scala, так и Kotlin поддерживают перегрузку операторов.

По сравнению с Kotlin, Scala использует гораздо более мягкий подход к перегрузке операторов. Он позволяет определить практически неограниченный набор функций, похожих на операторы. При ответственном использовании гибкий подход Scala к перегрузке операторов может сделать ваш код гораздо более удобочитаемым для человека: a+ b легче читать, чем a.plus(b) . Эта функция также делает Scala подходящей для разработки внутренних доменных языков (если вы хотите создать внешние DSL, для Scala доступно несколько мощных библиотек комбинаторов синтаксических анализаторов). Однако, как и все расширенные функции Scala, неправильно используемые, перегрузка операторов может привести к тому, что код будет трудно расшифровать, особенно если вы новичок в Scala.

Котлин пытается найти баланс между мощностью и удобочитаемостью, позволяя вам перегружать базовые операторы , Которые уже есть в языке ( + , – и т.д.), Не позволяя вам определять совершенно новые. В Kotlin вы определяете оператор, реализуя соответствующую стандартную функцию и аннотируя ее ключевым словом “оператор”.

Эти ограничения означают, что большинство операторов Kotlin легко понять, даже для разработчиков, которые только начинают работать с Kotlin. Недостатком является то, что перегрузка оператора Kotlin не дает вам почти такого же уровня гибкости и мощности, которые вы получаете с помощью Scala.

Встраивание

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

Компилятор Java будет выполнять встраивание автоматически, но язык Java на самом деле не предоставляет вам способа встраивания функций вручную. Если вы все-таки переключитесь на Scala или Kotlin, вы получите возможность встроить функции вручную.

В Scala вы можете запросить, чтобы компилятор попытался встроить метод , аннотируя его с помощью @inline , например:

@inline   final def f1(x: Int) = x

Обратите внимание на слово запрос — в конечном счете, компилятор имеет решающее слово в том, действительно ли эта функция встроена или нет.

В Kotlin всякий раз, когда вы используете ключевое слово “inline”, компилятор будет всегда встроить функцию. Однако имейте в виду, что вставка дублирует тело функции на каждом сайте вызова, поэтому интенсивное использование ключевого слова “встроенный” может привести к тому, что ваш код выйдет из-под контроля.

По сути, вам нужно быть гораздо более осторожным в том, где вы используете ручную встраивание в Kotlin, по сравнению с Scala. В частности, вам следует избегать встраивания больших функций, которые используются в нескольких местах вашего кода.

Классы данных

Классы прецедентов Scala и классы данных Котлина выполняют аналогичную функцию. Оба они предоставляют вам способ представления объекта хранения данных без необходимости написания тонны шаблонного кода.

Аннотирование обычного класса с помощью “случая” (Scala) или “данных” Ключевое слово (Kotlin) запускает автоматическую генерацию большей части стандартного кода, связанного с объектами модели данных, включая toString, equal и хэш-код, а также методы доступа и настройки.

Однако одно заметное отличие состоит в том, что Kotlin не может автоматически выводить параметры конструктора, поэтому вам нужно будет объявить их как вал или вар . Например, вот пример класса case Scala:

case class Date(month: String, day: Int)

Но эквивалент Котлина был бы:

data class Date(var month:String, var day: Int)

Вывод

Хотя вы можете сравнивать и противопоставлять любые языки программирования, когда дело доходит до решения, какой язык “лучше”, нет единого ответа, который будет работать для всех.

Независимо от того, представляет ли Scala или Kotlin лучшую альтернативу Java для вас, в частности, в конечном итоге будет зависеть от того, что вы ищете в языке программирования, как вы планируете использовать этот новый язык и ваши причины(причины) для ухода от Java в первую очередь.

Если вы в целом довольны функциями, которые предлагает Java, но разочарованы количеством шаблонного кода, который вам нужно написать, то, возможно, вам захочется попробовать Kotlin. Однако, если вы сыты по горло самой Java и жаждете более продвинутых и мощных функций, особенно если вы работаете с большими данными, то Scala предлагает сильную альтернативу Java — если вы готовы потратить немного больше времени на освоение вашего нового языка программирования.

Оригинал: “https://www.codementor.io/@jessicathornsby/kotlin-vs-scala-what-should-i-choose-instead-of-java-bwn9axvr8”