Вы находитесь на странице: 1из 26

Kotlin vs Java

Что лучше для Android-разработки?


Проверяемые исключения

Одно из основных различий между Java и Kotlin


заключается в том, что в последнем нет условий
для проверяемых исключений (checked exception).
Следовательно, нет необходимости отлавливать
или объявлять какие-либо исключения
Краткость кода
Сравнение класса Java с эквивалентным классом Kotlin
демонстрирует лаконичность кода Kotlin. Для той же
операции, что выполняется в классе Java, класс Kotlin
требует меньше кода (что существенно экономит время
разработчика)
Вот пример того, как без библиотек
происходит присвоение текста полю:

Java:
final TextView helloTextView = (TextView) findViewById(R.id.text_view_id);
helloTextView.setText("Some text");

Kotlin:
helloTextView.text = "Some text"
Сопрограммы
Процессы, интенсивно загружающие процессор и
сетевой ввод-вывод, обычно используют длительные
операции. Вызывающий поток блокируется до
завершения всей операции. Поскольку Android
является однопоточным по умолчанию,
пользовательский интерфейс приложения полностью
блокируется, как только блокируется основной поток
Традиционное решение этой проблемы в Java - создать
фоновый поток для длительной или интенсивной работы.
Однако управление несколькими потоками приводит к
увеличению сложности, а также к ошибкам в коде

Kotlin также позволяет создавать дополнительные


потоки. Тем не менее, есть лучший способ управления
интенсивными операциями в Kotlin, известный как
сопрограммы или корутины (coroutines). Корутины в Kotlin
реализованы без стека, что означает, что они требуют
меньшего использования памяти по сравнению с
обычными потоками
Корутины могут выполнять длительные и интенсивные
задачи, приостанавливая выполнение, не блокируя поток,
а затем возобновляя выполнение через некоторое время.
Это позволяет создавать неблокирующий асинхронный
код, который выглядит в работе как синхронный

Код с использованием корутин не только понятен, но и


лаконичен. Более того, корутины позволяют создавать
элегантные дополнительные стили асинхронной
неблокирующей разработки, такие как async / await

Все это также явно относится к плюсам Котлина


Классы данных
Java Kotlin
В полноразмерных проектах обычно есть У Kotlin есть очень простой способ
несколько классов, предназначенных создания таких классов. Разработчику
исключительно для хранения данных. достаточно включить только ключевое
Хотя эти классы практически не имеют слово data в определение класса, и все -
функциональности, разработчику компилятор сам позаботится обо всем.
необходимо написать много стандартного
кода на Java. Такое удобство создания классов явно
свидетельствует в пользу Kotlin
Обычно разработчик должен определить
конструктор и несколько полей для
хранения данных, функции геттеры и
сеттеры для каждого из полей, а также
функции equals(), hashCode() и toString()
Функции расширения
Kotlin позволяет разработчикам расширять класс новыми
функциями с помощью функций расширения. Эти функции,
хотя и доступны в других языках программирования, таких
как C#, не доступны в Java
Создать функцию расширения в Kotlin легко. Это делается
путем добавления префикса к имени класса, который должен
быть расширен до имени создаваемой функции. Чтобы
вызвать функцию в экземплярах расширенного класса,
нужно использовать нотацию «.»
Функции высшего
порядка и лямбды
Функция высшего порядка - это функция, которая
принимает другие функции в качестве параметров или
возвращает функцию
Кроме того, функции Kotlin являются функциями первого
класса. Это означает, что они могут храниться в структурах
данных и переменных, которые могут передаваться в
качестве аргументов и возвращаться из других
функций более высокого порядка

Все это просто означает, что функции могут работать всеми


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

Анонимные функции и лямбда-выражения также известны


как функциональные литералы. Это функции, которые не
объявлены, но передаются как выражения
Неявные расширяющие
преобразования
В Котлине нет поддержки неявных расширяющих
преобразований для данных. Таким образом, меньшие типы
не могут быть преобразованы в большие типы. В то время
как Java поддерживает неявные преобразования, Kotlin
требует выполнить именно явное преобразование
Ряд разработчиков воспринимает это как минус Котлин
Встроенные функции
Переменные, к которым осуществляется доступ в теле функции,
называются замыканиями. Использование функций высшего
порядка может существенно увеличить время выполнения
вычислений. Каждая функция в Kotlin является объектом, и он
захватывает замыкание
И классы, и функторы требуют выделения памяти. Они, наряду с
виртуальными вызовами, требуют определенных затрат на
время выполнения. Таких дополнительных издержек можно
избежать, вставив лямбда-выражения в Kotlin. Одним из таких
примеров является функция lock()
В отличие от Kotlin, Java не обеспечивает поддержку
встроенных функций. Тем не менее, компилятор Java
способен выполнять встраивание с использованием метода
final. Это так, потому что методы final не могут быть
переопределены подклассами. Кроме того, вызов метода
final разрешается во время компиляции

Такие нововведения также воспринимаются как плюсы


Котлина
Встроенная поддержка
делегирования
Делегирование в Kotlin является альтернативой
наследования. Этот механизм позволяет использовать
множественное наследование. Кроме того, делегированные
свойства Kotlin предотвращают дублирование кода
Не-private поля
Неприватные поля или public поля в Java полезны в
сценариях, где вызывающие объекты должны
меняться в соответствии с их представлением. Это
означает, что такие поля предоставляют
представление объекта вызывающим объектам. У
Kotlin нет не-private полей
Это достаточно интересное отличие при сравнении
Kotlin и Java
Нулевая безопасность
Одной из самых заметных проблем для разработчиков,
связанных с Java, является NullPointerExceptions. Java
позволяет разработчикам присвоить значение null любой
переменной. Однако, если они пытаются использовать
ссылку на объект с значением null, возникает исключение
NullPointerException!
В отличие от Java, в Kotlin все типы по умолчанию
являются не-nullable. Если разработчики попытаются
присвоить или вернуть значение null в коде Kotlin, во
время компиляции произойдет сбой
Тем не менее, есть способ обойти этот момент. Чтобы
присвоить значение null переменной в Kotlin, необходимо
явно пометить эту переменную как nullable. Это делается путем
добавления знака вопроса после типа, например:

val number: Int? = null

Таким образом, в Kotlin нет исключений NullPointerException.


Если вы встречаете такое исключение в Kotlin, то, скорее всего,
вы либо явно присвоили значение null, либо это связано с
каким-то внешним Java-кодом
Умные приведения
Прежде чем объект может быть приведен в Java,
обязательно нужно проверить тип. Это также верно в
сценариях, где очевидно нужно приводить объект

В отличие от Java, Kotlin имеет функцию умного


приведения, которая автоматически обрабатывает такие
избыточные приведения. Вам не нужно выполнять
приведение внутри оператора, если он уже проверен
оператором is в Kotlin
Статические члены
В Kotlin нет статических элементов. Однако в Java
ключевое слово static отражает то, что конкретный
член, с которым используется это ключевое слово,
принадлежит самому типу, а не экземпляру этого типа
Это просто означает, что один и только один
экземпляр этого статического члена создается и
используется всеми экземплярами класса
Поддержка конструкторов

Kotlin, в отличие от классов Java, могут иметь один


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

(состояние) ? (значение 1) : (значение 2)


Типы подстановочных знаков
В общем коде, ' ?' представляет неизвестный тип. Этот символ
известен как подстановочный знак. Существует несколько
вариантов использования подстановочного знака, в том числе
в качестве типа поля, локальной переменной или параметра

В то время как система типов Java предлагает использовать


подстановочные знаки, в Kotlin их нет. Тем не менее, у него есть
два других механизма - вариативность на уровне объявления и
проекции типов как альтернатива
Так что же в итоге?
Несмотря на значительные плюсы Kotlin, в вопросах
разработки общего назначения Java одерживает верх. С
другой стороны, все больше разработчиков и
организаций внедряют Kotlin для быстрой разработки
Android приложений. И Java, и Kotlin имеют свои
преимущества друг перед другом
Независимо от всех различий между двумя языками
программирования, они полностью совместимы. И Java, и
Kotlin компилируются в байт-код. Это означает, что в
вопросах «Kotlin или Java» не будет однозначного ответа,
ведь можно вызывать код Java из Kotlin и наоборот
Спасибо за внимание!
Презентацию выполнила Ключко Эвелина,
группа 6.04.122.010.17.03