JavaRush/Java блог/Android/Есть ли отличие Kotlin от Java?
Paul Soia
26 уровень

Есть ли отличие Kotlin от Java?

Статья из группы Android
участников
Всем привет. Хочу рассказать немного базовых вещей о языке Kotlin, что будет полезно новичкам. Так уж сложилось, что сейчас попасть в android-разработку только с одним языком будет сложно — большинство новых проектов начинают писать на Kotlin, большинство готовых проектов написаны на Java. Есть ли отличие Kotlin от Java? - 1На данный момент у меня на работе 4 проекта: два на Kotlin и два на Java (один большой основной и три маленьких, для внутреннего пользования). Когда компанией было принято решение писать новые проекты на Kotlin, для меня это решение казалось странным. Зачем мешать разные языки? Пусть себе кто-то другой пишет на Kotlin, нам оно зачем? Но выхода не было, потому решил опробовать новый язык и начал его изучать. Первый код, естественно, был полностью написан в стиле Java, что еще больше добавляло непонимания: зачем мне новый язык? Но по мере его использования я всё больше находил преимуществ и сейчас (уже почти 2 года пишу на Kotlin) могу сказать, что в андроид-разработке Kotlin удобнее. Хочу показать некоторые нюансы, которые будут неочевидны для того, кто решил начать изучать Kotlin после Java. Также напомню, что в андроиде используется Java 8, при нынешней актуальной версии 14. Итак, первое — Переменные: Java:
Int a = 1;
String s = "test";
Kotlin:
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
{...}
Или так:
switch(выражениеДляВыбора) {
        case (значение 1):
                Код1;
                break;
        case (значение 2):
                Код2;
                break;
...
        case (значение N):
                КодN;
                break;
        default:
                КодВыбораПоУмолчанию;
                break;
        }
В Kotlin используется для таких выражений оператор when (хотя if/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;
    }
}
Kotlin:
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) {
        this.firstName = 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();
В Kotlin мы можем сделать расширение для класса:
fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
И дальше по всему проекту использовать это вот так:
context?.toast("hello world")
Мы сделали расширение для класса Context. И теперь везде, где доступен context, будет доступен его новый метод toast. Это можно сделать для любого класса: String, Fragment, ваши кастомные классы, ограничений нет. И последний пункт, который разберем — Работа со строками. Тут всё просто. В Java это пишется так:
String s = "friends";
int a = 5;
System.out.println("I have" + a + s + "!");
В Kotlin проще:
val s = "friends"
val a = 5
println("I have $a $s!")
Это те нюансы, на которых я спотыкался в начале изучения Kotlin, надеюсь вам это поможет.
Комментарии (37)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Руслан
Уровень 12
11 сентября 2021, 07:28
Если для андроид разработки нужен ещё и Котлин помимо Джава, его долго, вообще учить? И, я так понимаю, его учить надо после Java?
Paul Soia Android Developer в Tallium
12 сентября 2021, 04:21
Да, для андроида сейчас основной котлин. Знать джаву желательно, но не обязательно.
Svetlana Zakharova
Уровень 13
24 июня 2022, 00:39
Если целитесь на андройд в перспективе, многие уже рекомендуют сразу входить через котлин Есть много видео, где с нуля на котлине объясняют основы программирования типа этого
Игорь Full Stack Developer в IgorApplications
16 июля 2022, 11:36
Не смешите меня, Kotlin особо не отличается от Java, для любого программиста нужно обезательно понимать Java код. Kotlin - синтаксический сахар.
DoDoshka
Уровень 8
25 июля 2021, 00:18
Ой как вы мен бесите, за 1 год в универе выучили 10 языков программирования от HDL до SQL А ща еще один учить...
hidden #1811171
Уровень 41
13 августа 2021, 18:31
если знаете Java то не нужно учить а просто просмотреть
Ян
Уровень 24
24 апреля 2022, 11:54
Скажите пожалуйста, имеется ввиду, что тому кто с Джавой Котлин легко познаётся? Т.е за пару недель можно привыкнуть к отличиям?
hidden #1811171
Уровень 41
24 апреля 2022, 16:01
я прочитала за два дня книжку по котлину после Java и за неделю привыкла кодить )
Paul Soia Android Developer в Tallium
27 апреля 2022, 07:59
да, максимум месяц и можно с джавы на котлин перейти.
Ян
Уровень 24
28 апреля 2022, 11:11
Android Developer, Paul Soia П.С Спасибо больше за ответ. Сейчас финальные задачи 19 уровня и там жесть, многие тоже как и я спотыкаются, не можем решить. Надо не падать духом.)
12 января 2021, 09:51
Сравнение джавы и котлина только в различиях базового синтаксиса вообще не отображает реального положения дел в экосистеме андроида. Если уж и говорить про синтаксис - отличия ярко выражены, когда дело доходит представлений и визуализации, но никак не в объявлении полей/переменных или конструкторов, что является банальным синтаксическим сахаром. Все вышеизложенное в этой статье делается парой кнопок IDE или либой (как кому удобнее), как мне - тема не раскрыта даже для новичков, все равно, что сравнить молоток и топор, тем и другим можно забивать гвозди, но цель инструментов разная.
Paul Soia Android Developer в Tallium
12 января 2021, 18:08
ждем с нетерпением раскрытия темы в вашей статье
Filand Gor
Уровень 29
21 декабря 2020, 17:55
как то не очень довно Googла посра...ось с Ораклом ( Саном) по поводу нашей любимой и многоуважаемой JAVAы . вот ,Googла, Kotlin и замутила в место нашей любимой и многоуважаемой JAVAы. лет так через пяток после очередной смены политики в плеймарките про нашу РАДОСТЬ и вспомнить будет некому. Kotlin - сильно похож на python много чего то специализированного ,но код получается гораздо демократичнее ( расхлябанней ) , а реиженерить его еще то удовольствие правда это можно побороть внутриквартирными стандартами но факналицо,нету порядка во вселенной везде валотильность и энтропия.... всё движется в сторону JavaSCIPT.
Ян
Уровень 24
24 апреля 2022, 11:56
под Радостью имеется ввилу Котлин? Простите, что туплю)
Mihail Android Developer в CDC
10 августа 2020, 18:34
Да-а-а , с API наверное тоже всё само взаимодействует. Приведите какой нибудь пример, интересно же:) Вот так всегда только начнёшь учить язык, проходит год, всё он устарел, учи другой. Учишь другой , прошло полгода, узнаешь что появился ещё один. Дайте первый то доучить:)
Paul Soia Android Developer в Tallium
11 августа 2020, 09:44
На самом деле зная джаву перейти в любой другой язык не проблема. С апи работает всё та же либа Retrofit. Там логика такая же как и в джаве
Павел Шабанов
Уровень 32
2 августа 2020, 13:22
Kotlin по сравнению с Java более лаконичен, меньше лишнего кода + null safety из коробки. И т.к. гугл объявили Kotlin приоритетным языком под android, то стоит как минимум с ним познакомиться. Думаю многим мобильным разработчикам придется пройти через отрицание, гнев, принятие. К тому же никто не запрещает вызывать код java из kotlin и наоборот :)
Сергеев Виктор
Уровень 40
Master
31 июля 2020, 21:59
Extensions вот это штука меня как-то в ступор поставила на ревью, когда увидел у мапы специфичный для нас метод )
Paul Soia Android Developer в Tallium
1 августа 2020, 05:49
Да, экстеншены - полезная штука
Ksenia Mario
Уровень 23
Master
28 июля 2020, 22:49
не вели слать в гугл, а вели слово молвить) а чем принципиальным отличается котлин и джава?
Paul Soia Android Developer в Tallium
29 июля 2020, 05:19
Прям принципиально - ничем))). Это всего лишь инструменты для написания програм. Джава типичный ООП язык. На котлине можно писать и в ООП стиле и в фунециональном.
Андрей
Уровень 29
Expert
29 июля 2020, 08:18
На джаве в функциональном стиле писать нельзя? Функциональные интерфейсы, ссылки на методы, лямбды, стримы, конвейеры, каррирование...
Paul Soia Android Developer в Tallium
29 июля 2020, 08:45
Я не знаю как в последних версиях джавы, я говорю о том, что доступно в андроиде. А там джава 8 только.
Андрей
Уровень 29
Expert
29 июля 2020, 09:14
Как раз с 8й версии это всё и появилось
Paul Soia Android Developer в Tallium
29 июля 2020, 17:59
да, но тут опять таки надо понимать реалии андроида. Все эти штуки начали из коробки поддерживать только с апи26 (android 8), а нынешние приложения в подавляющем большинстве поддерживают апи21+ (андроид 5). То есть уже будет проблема использовать эти фичи.
Сергей Java Developer в Сбер Expert
26 июля 2020, 22:41
По поводу объявления переменных, тоже самое есть в java. C 11 версии можно объявлять черех var. C библиотекой lombok можно объявлять через val (с 8 java точно) Однако, удобство сомнительное. С одной стороны эта запись короче. Но с другой, ты видишь стразу, что возвращает метод, тогда как с записью val, это не понятно. Вот пример. Что возвращает метод во второй строке, непонятно. Нужно делать дополнительные действия чтобы это выяснить.
String result = someMethod();

val res = anotherMethod();
Вообще библиотека lombok, о которой я писал добавляет много таких фишек в java. В результате отличия минимальны и недостаточны для перехода с java на kotlin. Отказ от java в пользу kotlin в Android это чисто политическое решение Google. Oracle давно судятся из-за нарушения авторских прав https://ain.ua/special/google-vs-oracle/
Paul Soia Android Developer в Tallium
27 июля 2020, 05:18
я лишь провел сравнение элементарного синтаксиса. Я ж никого не призываю переходить на котлин. Для бека на джаве есть полно отличных инструментов, типа Spring. Для андроида сейчас актуален котлин. Если хочешь идти в сторону мобильной разработки, то там рулит именно этот язык. Кроме синтаксиса у котлина есть еще корутины (многопоточная работа), можно в градле писать на котлине, а не на groovy. Lombok я раньше использовал. Вполне себе костыльное решение. Зачем использовать джаву с кучей либ если есть котлин и всё из коробки? По поводу того, что возвращает метод - что мешает писать так:
val res: String = anotherMethod()
Ты вообще можешь весь код писать в стиле джавы. Те же конструкторы можно писать как и в джаве, создавать их по несколько. Даже точку с запятой ставить можешь. Но поверь, через некоторое время ты перестанешь это делать, потому что в этом нету необходимости.
Александр Плохой Senior Java Developer в freelance
26 июля 2020, 18:13
Kotlin представляет интерес исключительно для тех, кто вообще не знает Java.. и крайне сомнительный интерес)
Daniil
Уровень 20
Expert
26 июля 2020, 18:23
А если человек собирается быть Android разработчиком...????
Paul Soia Android Developer в Tallium
26 июля 2020, 18:29
я тоже так думал пока не знал котлин. Но на данный момент в андроиде котлин - выбор номер один. Джава для андроида не развивается. Я в статье написал, что последняя версия джавы - 14. Но она не поддерживается в андроиде. Там всё ограничивается версией 8.
Александр Плохой Senior Java Developer в freelance
26 июля 2020, 19:51
Во-первых, с чего ты взял, что я не знаю Kotlin..?) А, во-вторых, все его "преимущества", описанные тобой в статье, при более тщательном рассмотрении оказываются очевидными недостатками. Kotlin - кастрированная и ущербная версия Java, годная только для тех, кто не владеет нормально языком и его фреймворками, а также ни разу не писал ничего сложнее убогого .apk приложения на мобилочку.. Для максимально узкого круга задач подойдет, если ты не в состоянии нормально разобраться в Java.
Paul Soia Android Developer в Tallium
26 июля 2020, 19:53
ничего не собираюсь тебе навязывать. Ты волен пользоваться чем тебе нравится. У каждого свои интересы.
Сергеев Виктор
Уровень 40
Master
31 июля 2020, 21:48
довольно узколобое утверждение, учитывая, что котлин полногстью совместим с java и там можно делать все тоже самое. Можно поподробнее про преимущества == недостатки? Есть вещи, которые не нравятся в котлине, но назвать котлин урезанной джавой, это заявление настоящего senior-pomidor)