Чем Kotlin отличается от Java
Kotlin и Java работают на одной виртуальной машине (JVM) и полностью совместимы: из Kotlin вызываются любые библиотеки Java, а из Java — код на Kotlin, и оба языка можно смешивать в одном проекте. Разница — в самом языке: первая версия Kotlin вышла через двадцать лет после первой Java, и то же самое он записывает короче и строже.
Главные отличия
| Java | Kotlin | |
|---|---|---|
| Пустые значения | любая ссылка может быть null, ошибка видна при запуске | String не бывает null, String? — бывает; проверяет компилятор |
| Переменные | int x = 5;, final int x = 5; | var x = 5, val x = 5 — тип выводится |
| Точка с запятой | обязательна | не нужна |
| Класс с данными | конструктор, геттеры, equals, toString пишутся или генерируются; с Java 16 — record | data class одной строкой |
| Сравнение строк | a.equals(b), а == сравнивает ссылки | a == b сравнивает текст |
| Выбор значения | cond ? a : b, switch | if и when возвращают значение |
| Наследование | классы открыты, закрывают словом final | классы закрыты, открывают словом open |
| Общее для класса | static | companion object или функции вне классов |
| Проверяемые исключения | throws обязателен | проверяемых исключений нет |
| Параметры по умолчанию | нет, пишут перегрузки | fun f(x: Int = 0) |
| Создание объекта | new Person("Anna") | Person("Anna") |
Один и тот же класс
Java:
public class Person {
private final String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}Kotlin:
class Person(val name: String, var age: Int)Обе версии дают одно и то же: свойство name только для чтения и изменяемое age. Из Java к классу на Kotlin обращаются привычно — person.getName(), а из Kotlin к классу на Java — как к свойству: person.name.
Что ещё есть в Kotlin
- Функции-расширения — свою функцию можно «добавить» к чужому классу:
fun String.shout() = uppercase() + "!", и дальше"hi".shout(). - Корутины — удобная работа с долгими операциями (сеть, файлы) без ручных потоков; подробнее — в справке Корутины — что это.
- Kotlin Multiplatform — общий код для Android, iOS, компьютера и браузера.
Java тоже развивается: в новых версиях появились var для локальных переменных, record, выражения switch и сопоставление с образцом. Разрыв меньше, чем был в 2016 году, но null-безопасности в Java на уровне компилятора нет.
Что учить первым
- Android — Kotlin: Google рекомендует его для новых приложений, официальные курсы и примеры — на нём.
- Серверы и крупные компании — Java встречается чаще, особенно в старых проектах, но новые всё чаще пишут и на Kotlin.
- Школа и олимпиады — подходят оба. Java есть почти во всех системах проверки задач, Kotlin — во многих; перед олимпиадой проверьте список языков.
Знания переносятся: циклы, классы, коллекции и библиотеки JVM устроены одинаково. Тот, кто выучил один язык, читает код на втором почти сразу. Курс по Java — в теме Java.
Подводные камни при переходе с Java
==в Kotlin сравнивает содержимое (какequals), а сравнение ссылок —===.- Деление целых работает так же:
7 / 2— это3. - Значения, пришедшие из кода на Java, компилятор Kotlin не всегда может проверить на
null— там ошибкаNullPointerExceptionвсё ещё возможна. - Классы закрыты: чтобы унаследоваться, родителя нужно пометить
open.