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

Для тех, кто не знает Kotlin, это язык, разработанный компанией Jetbrains (известной своей IDE Intellij IDEA). Он был разработан для замены Java. Он более краткий, элегантный, безопасный и работает на JVM, что делает его полностью совместимым с существующими библиотеками Java (и даже с другими). Но чтобы заменить широко используемую Java, новый язык должен иметь действительно веские аргументы.

Здесь я попытаюсь обобщить эти аргументы, объяснив, почему, по моему мнению, разработчикам программного обеспечения следует начать переход с Java на Kotlin. Для начала я напишу 5 первых пунктов, которые объясняют, почему Kotlin лучше Java, чем Java. Во второй части пять следующих пунктов объяснят, почему это просто хороший язык сам по себе и почему вы должны его попробовать.

Вывод типа

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

Например, Kotlin позволяет нам писать такие вещи, как:

(Примечание: var означает, что это переменная, поэтому значение может меняться, а val означает, что это значение, то есть в основном константа; кстати, var был добавлен в последние версии Java, но ограничен локальными переменными)

Первый пример будет преобразован в int i = 0; в Java, что заставляет нас указывать тип, даже если он очевиден из-за аффектации. Но выигрыш более очевиден во втором примере, который можно перевести как List ‹Integer› myList = new ArrayList ‹Integer› (), где повторение затрудняет запись и чтение.

Но главное преимущество вывода типа заключается в том, что вы вызываете функцию, не зная ее возвращаемый тип (когда вы используете API, с которым не знакомы). Используя этот синтаксис, это просто не проблема, потому что вам не нужно явно указывать тип.

Также важно отметить, что этот тип системы типов действительно отличается от того, что мы видим в Python и JavaScript: даже несмотря на то, что синтаксис не дает четкого представления, Kotlin статически и строго типизирован. Это означает, что вы избегаете боли, связанной с явным указанием типа используемых вами переменных, в то время как у вас есть полностью функциональное автозаполнение и статический анализ кода, предотвращающий вызов необъявленных функций или доступ к необъявленным переменным.

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

Когда вышла Java, она отказалась включать перегрузку операторов, в то время как эта функция активно использовалась в C ++.

Основными причинами этого являются плохая семантическая ценность операторов (особенно если автор кода злоупотреблял перегрузкой операторов) и возможность перегрузить любой оператор (C ++ позволяет перегрузить оператор new …).

Но при правильном использовании это действительно удобно. Доступ к i-му элементу списка с использованием myList [i] вместо myList.get (i) действительно практичен. А добавление элемента на карту с помощью myMap [myKey] = myValue более читабельно, чем myMap.put (myKey, myValue).

Допустим, мы хотим создать класс «Vector2D», мы можем разрешить писать a + b (где a и b - два Vector2D) просто написав это:

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

Функции расширения

Иногда вы используете класс и думаете, что было бы довольно удобно иметь эту конкретную функцию, которую вы разработали непосредственно в классе, но у вас нет контроля над ее исходным кодом. Единственный способ - расширить класс посредством наследования, но это не всегда возможно (если класс final, который используется по умолчанию в Kotlin, если конструктор private и т. Д. .).

Функции расширения позволяют определять функции, которые можно вызывать, как если бы они были определены в определенном классе.

На самом деле, это просто синтаксический сахар: он не полагается на наследование и не меняет поведения и кода класса.

Допустим, я использую предыдущий класс Vector2D и хочу расширить класс функцией dotProduct, принимающей два Vector2D в качестве параметра и вычисляющей скалярное произведение двух векторов. Я считаю, что не могу унаследовать класс.

На Java я бы написал это так:

А с помощью Kotlin это было бы так:

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

Аргументы по умолчанию и именованные аргументы

Опять же, аргументы по умолчанию и именованные аргументы - это в основном синтаксический сахар, предоставляемый Kotlin.

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

Версия Java:

Версия Котлина:

Именованные аргументы не имеют альтернативы в Java. Это просто возможность указать аргумент, указав его имя (а не просто поместив его в нужное место). Это делает код более читабельным, а также более кратким, когда мы хотим указать значения только для некоторых аргументов.

Лаконичный и элегантный синтаксис

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

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

Например, почему мы должны явно писать new при вызове конструктора? Если мы вызываем конструктор, очевидно, что мы хотим создать новый объект ...

Тогда зачем мне писать void, если моя функция ничего не возвращает?

Разве значение public не должно быть значением по умолчанию для функции?

Разве мы не можем автоматически сгенерировать геттеры и сеттеры (если член не является частным и не окончательным)?

И т. Д. И т. Д.

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

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

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