Comparison to Java
Kotlin fixes a series of issues that Java suffers from:
- Null references are controlled by the type system.
- No raw types
- Arrays in Kotlin are invariant
- Kotlin has proper function types, as opposed to Java’s SAM-conversions
- Use-site variance without wildcards
- Kotlin does not have checked exceptions
What Java has that Kotlin does not
- Checked exceptions
- Primitive types that are not classes. The byte-code uses primitives where possible, but they are not explicitly available.
- Static members are replaced with companion objects, top-level functions, extension functions, or @JvmStatic.
- Wildcard-types are replaced with declaration-site variance and type projections.
- Ternary-operator a ? b : c is replaced with if expression.
What Kotlin has that Java does not
- Lambda expressions + Inline functions = performant custom control structures
- Extension functions
- Null-safety
- Smart casts
- String templates
- Properties
- Primary constructors
- First-class delegation
- Type inference for variable and property types
- Singletons
- Declaration-site variance & Type projections
- Range expressions
- Operator overloading
- Companion objects
- Data classes
- Separate interfaces for read-only and mutable collections
- Coroutines
What’s next?
Kotlin vs Java
«Kotlin – новый язык программирования, который заставит вас отказаться от Java». На европейской конференции Zebra APPFORUM 2017 в Праге наш Android-разработчик Питер Оттен вдохновлял других начать писать на Kotlin. Расстроены, что пропустили? Не переживайте! Питер расскажет вам, почему он стал большим поклонником этого языка.
Подъем
Kotlin – это язык программирования, разработанный компанией Jetbrains, которая знаменита IntelliJ, WebStorm, PhpStorm и плагином ReSharper для Visual Studio. Они занялись поисками нового языка программирования, который был бы лучше, чем Java, но все еще функционально совместим с ним. Вдохновляясь языками Java, C#, Scala и Groovy, ребята из Jetbrains собрали команду для разработки нового языка программирования. Kotlin проектировался людьми, которые испытали всю боль Java.
Так что же такое 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 можно заметить следующие различия:
- Методы в Kotlin называются fun (это сразу же делает программирование веселее);
- Если метод ничего не возвращает, то тип возвращаемого значения указывать не надо (в Java нужно писать “void”);
- В Kotlin есть инференция типов, поэтому указывать, что “name” имеет тип “String” не нужно. Просто используйте “val”.
- Также эта особенность делает переменную неизменяемой. Если вы захотите изменить переменную “name“, нужно использовать “var”. Так Kotlin заставляет вас при написании кода заранее думать о переменных/полях и т.д.
- Для создания нового экземпляра класса ключевое слово “new” не нужно;
- Kotlin и Java совместимы. Kotlin без проблем может использовать класс Person, написанный на Java.
- Геттеры и сеттеры из кода на Java автоматически станут свойствами, то есть “getName()” в Kotlin будет недоступно, но можно использовать свойство “name” из Person.
Выводы Mediaan об использовании Kotlin
После посещения других докладов о Kotlin на Droidcon в 2015 и 2016 в Лондоне и GDG DevFest 2016 в Амстердаме наша команда мобильных разработчиков решила, что пришло время взглянуть на новый язык. Мы начали использовать его в октябре 2016 года и просто влюбились в него. Первый новый проект под Android уже был на 100% написан на Kotlin. С тех пор мы не возвращались к Android-разработке на Java.
Теперь, когда мы оглядываемся назад, на наш опыт работы с Java, и видим то, как используется Kotlin сейчас, можно сделать следующие выводы:
- Код более лаконичен, то есть вы сможете писать и поддерживать меньшее количество кода;
- Код более безопасный, поскольку язык заставляет вас думать о (не)изменяемости, nullability и т.д. во время написания кода;
- Вышесказанное также ускоряет развитие. Вам становится проще делать сложны вещи.
- Отличная поддержка IDE (мы пользуемся Android Studio);
- Большое и растущее сообщество. Существующие библиотеки поддерживаются или мигрируют в Kotlin, интернет переполнен постами в блогах, видео, презентациями и, конечно же, вопросами/ответами на
StackOverflow. - Kotlin уже готов к продакшену. Мы используем его на продакшене также, как и многие компании, такие как Square, Pinterest, Trello и Google.
Итак, начнете ли вы с Kotlin или перейдете на него?
Есть множество ссылок, которые помогут вам в его освоении:
- Официальный сайт;
- Документация (руководства, справочники, книги и т.д.);
- Программирование онлайн;
- Android-разработка;
- Выступления, блоги и презентации на YouTube, Medium и SlideShare.
Чтобы использовать Kotlin в уже существующем проекте или чтобы полностью перенести существующий проект на него, мы рекомендуем следующий подход:
- Используйте интероперабельность (Kotlin и Java могут работать бок о бок);
- Используйте плагин для конвертации файлов и фрагментов кода.
- Все новые функции пишите на Kotlin;
- Все, что вы редактируете, конвертируйте из Java в Kotlin.
О будущем
Помимо поддержки JVM, Android и JavaScript, Kotlin работает над поддержкой большего числа платформ. Поддержка машинного кода – это следующий большой шаг. Например, запустить код на RaspBerry Pi уже можно (в бета версии). Jetbrains работает над добавлением поддержки для iOS, MacOS и Windows. Это значит, что Kotlin может однажды стать основной нового кроссплатформенного решения для приложений. Больше информации о дальнейшем развитии вы сможете узнать на KotlinConf, их собственной конференции в конце этого года в Сан-Франциско.
Есть ли отличие Kotlin от Java?
Всем привет. Хочу рассказать немного базовых вещей о языке Kotlin, что будет полезно новичкам. Так уж сложилось, что сейчас попасть в android-разработку только с одним языком будет сложно — большинство новых проектов начинают писать на Kotlin, большинство готовых проектов написаны на Java. На данный момент у меня на работе 4 проекта: два на Kotlin и два на Java (один большой основной и три маленьких, для внутреннего пользования). Когда компанией было принято решение писать новые проекты на Kotlin, для меня это решение казалось странным. Зачем мешать разные языки? Пусть себе кто-то другой пишет на Kotlin, нам оно зачем? Но выхода не было, потому решил опробовать новый язык и начал его изучать. Первый код, естественно, был полностью написан в стиле Java, что еще больше добавляло непонимания: зачем мне новый язык? Но по мере его использования я всё больше находил преимуществ и сейчас (уже почти 2 года пишу на Kotlin) могу сказать, что в андроид-разработке Kotlin удобнее. Хочу показать некоторые нюансы, которые будут неочевидны для того, кто решил начать изучать Kotlin после Java. Также напомню, что в андроиде используется Java 8, при нынешней актуальной версии 14. Итак, первое — Переменные: Java:
val a = 1 var b = 2 val c: Int val d = "test"
В Kotlin переменные двух типов: val (только для чтения) и var (для чтения и записи). Рекомендуется использовать val везде, где это возможно. Объявлять тип переменной не обязательно, если переменная уже инициализирована. Второе — выражения if/else, switch: Как часто вы используете в Java такую цепочку операторов:
if (вариант 1) else if (вариант 2) . else
val x = 5 val result = when(x) < 0, 1 ->"cool" 2 -> "bad" 5 -> "normal" else -> "error" > System.out.println(result)
Здесь мы не просто прошлись по цепочке условий, а еще и всё выражение сразу присвоили в переменную result, что сократило нам немало строк кода. Но всё же если у вас только два варианта в ветвлении, рекомендую использовать обычный if..else. Конструкция when будет короче только от трех вариантов. Идем дальше — Конструкторы. Здесь вообще сказка. Просто сравните код в Java и Kotlin. Java:
public class Person < private String firstName; private String lastName; private int age; public Person(String firstName, String lastName, int age) < this.firstName = firstName; this.lastName = lastName; this.age = age; >public String getFirstName() < return firstName; >public String getLastName() < return lastName; >public int getAge() < return age; >public void setAge(int age) < this.age = age; >>
class Person(private val firstName: String, private val lastName: String, private var age: Int)
Может показаться, что в коде на котлине что-то не дописали. Но нет, это два идентичных кода на разных языках. Давайте немного разберемся. В Kotlin конструктор можно прописывать прямо в теле названия класса (но если хочется, то можно и по старинке, как в Java). Итак, мы прописали три переменные, в Java создали конструктор, геттеры и один сеттер для переменной age. В Kotlin, как мы помним, переменная val только для чтения, а потому сеттер для этих переменных недоступен (геттеры-сеттеры котлин реализует под капотом сам). Переменная var дает возможность использовать сеттер. В итоге практически одной строкой мы написали то же самое, что на Java заняло больше десятка строк. Здесь рекомендую еще почитать про data class в Kotlin. Но это еще не всё, в чем хороши конструкторы в Kotlin. А что, если вам надо два конструктора? А если три? В Java это будет выглядеть так:
public Person(String firstName, String lastName, int age) < this.firstName = firstName; this.lastName = lastName; this.age = age; >public Person(String firstName, String lastName) < this.firstName = firstName; this.lastName = lastName; >public Person(String firstName)
Ничего сложного, сколько надо конструкторов, столько и сделали. В Kotlin можно обойтись одним конструктором. Как? Всё просто — значения по умолчанию.
class Person(private val firstName: String, private val lastName: String? = null, private var age: Int = 5)
Person(firstName = "Elon", lastName = "Mask", age = 45) Person(firstName = "Elon", age = 45) Person(firstName = "Elon", lastName = "Mask")
private val lastName: String? = null
Что еще за знаки вопроса? Да, если значение может быть null, то ставится ? .Также есть вариант вот такой — !! (если переменная не может принимать null). Об этом уже сами почитайте, там всё просто. А мы идем к следующему пункту. Extensions. Это очень крутой инструмент в Kotlin, которого нету в Java. Иногда мы в проекте используем шаблонные методы, которые повторяются во многих классах. Например, так:
Toast.makeText(this, "hello world :)", Toast.LENGTH_SHORT).show();
fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
Мы сделали расширение для класса Context. И теперь везде, где доступен context, будет доступен его новый метод toast. Это можно сделать для любого класса: String, Fragment, ваши кастомные классы, ограничений нет. И последний пункт, который разберем — Работа со строками. Тут всё просто. В Java это пишется так:
String s = "friends"; int a = 5; System.out.println("I have" + a + s + "!");
val s = "friends" val a = 5 println("I have $a $s!")