Java все еще может быть первым языком программирования, который приходит на ум, когда вы думаете об Android, но вам не нужно использовать Java для разработки Android. Фактически, Kotlin теперь является предпочтительным официальным языком Google для Android!
Сегодня Android Studio поставляется со встроенной поддержкой Kotlin, поэтому создать проект Android, который понимает код Kotlin, так же просто, как установить флажок в мастере создания проектов Android Studio. Поддержка этого варианта со временем выросла до такой степени, что теперь это решение в основном сводится к предпочтениям.
Но если вы перейдете с Java на Kotlin, что именно вы получите? Какие функции есть у Kotlin, чего нет у Java, и наоборот?
В этой статье мы рассмотрим все основные различия между Kotlin и Java.
Kotlin vs Java, последний предлагает более лаконичный код — без findViewByIds
Если вы сравните класс Kotlin и класс Java, которые выполняют одну и ту же работу, то класс Kotlin, как правило, будет намного более кратким, но есть одна область, в которой Kotlin может серьезно сократить объем шаблонного кода, который вам нужно писать: findViewByIds .
Расширения Kotlin для Android позволяют импортировать ссылку на представление в файл действия, после чего вы сможете работать с этим представлением, как если бы оно было частью действия. Результат? Вам больше никогда не придется писать еще один метод findViewById!
Прежде чем вы сможете использовать эти расширения, вам нужно добавить дополнительный плагин в файл build.gradle на уровне модуля (примените плагин: «kotlin-android-extensions»), но после этого вы готовы начать импорт представлений. Например, если ваш файл activity_main.xml содержит TextView с идентификатором textView, вы должны добавить в свою активность следующее:
import kotlinx.android.synthetic.main.activity_main.textView
Затем вы можете получить доступ к этому TextView, используя только его идентификатор:
textView.setText("Привет мир!")
Это гораздо более лаконично, чем эквивалент Java:
TextView text = (TextView) findViewById(R.id.textView);
text.setText("Привет мир");
Kotlin по умолчанию является null безопасным
Исключения NullPointerException огромный источник разочарования для разработчиков Java. Java позволяет присвоить значение null любой переменной, но если вы попытаетесь использовать ссылку на объект, имеющую значение null, приготовьтесь столкнуться с NullPointerException!
Читайте также: Я хочу разрабатывать приложения для Android — какие языки мне следует изучать?
В Kotlin все типы по умолчанию не обнуляемые (не могут содержать нулевое значение). Если вы попытаетесь присвоить или вернуть null в своем коде Kotlin, произойдет сбой во время компиляции, поэтому ни одна из следующих строк не будет скомпилирована:
val name: String = null
fun getName() : String = null
Если вы действительно хотите присвоить нулевое значение переменной в Kotlin, вам необходимо явно пометить эту переменную как обнуляемую, добавив вопросительный знак после типа:
val number: Int? = null
Это делает почти невозможным столкнуться с NullPointerExceptions в Kotlin — на самом деле, если вы столкнетесь с этим исключением, то, скорее всего, это потому, что вы явно попросили Kotlin выдать его, или NullPointerException исходит из внешнего кода Java.
Функции расширения
Kotlin дает разработчикам возможность расширять класс новыми функциями, что идеально, если есть класс, в котором вы всегда чувствовали, что отсутствует важный метод!
Эти «функции расширения» недоступны в Java, хотя они доступны в других языках программирования, которые можно использовать для разработки под Android, таких как C#.
Читайте далее: Руководство по разработке приложений для Android для начинающих за 5 простых шагов
Вы создаете функцию расширения, добавляя префикс имени класса, который вы хотите расширить (например, «String»), к имени создаваемой вами функции («styleString»), например:
fun String.styleString(): String {
// Style the string and then return it//
}
Затем вы можете вызывать эту функцию для экземпляров расширенного класса через .the, как если бы оно было частью этого класса:
myString.styleString()
Корутины — граждане первого класса
Всякий раз, когда вы инициируете длительную операцию, такую как сетевой ввод-вывод или работу с интенсивным использованием ЦП, вызывающий поток блокируется до завершения операции. Поскольку Android по умолчанию является однопоточным, как только вы заблокируете основной поток, пользовательский интерфейс вашего приложения зависнет и не будет отвечать до завершения операции.
В Java решение традиционно заключалось в создании фонового потока, в котором вы можете выполнять эту интенсивную или длительную работу, но управление несколькими потоками может привести к созданию сложного, подверженного ошибкам кода, а создание нового потока является дорогостоящей операцией.
Хотя вы можете создавать дополнительные потоки в Kotlin, вы также можете использовать сопрограммы. Корутины выполняют длительные и интенсивные задачи, приостанавливая выполнение в определенный момент без блокировки потока, а затем возобновляя эту функцию позже, возможно, в другом потоке. Это позволяет создавать неблокирующий асинхронный код, который выглядит синхронно и поэтому более четкий, лаконичный и удобочитаемый. Корутины также не имеют стека, поэтому они потребляют меньше памяти по сравнению с потоками и открывают двери для дополнительных стилей асинхронного неблокирующего программирования, таких как async/await.
Нет проверенных исключений
В Kotlin нет проверенных исключений, поэтому вам не нужно перехватывать или объявлять какие-либо исключения.
Привлекает ли это вас к Kotlin или заставляет придерживаться Java, зависит от вашего мнения о проверенных исключениях, поскольку это функция, разделяющая сообщество разработчиков. Если вы устали от блоков try/catch, загромождающих ваш Java-код, вы будете довольны этим упущением, однако, если вы обнаружите, что проверенные исключения побуждают вас думать об устранении ошибок и в конечном итоге подталкивают вас к созданию более надежного кода. кода, то вы, скорее всего, увидите в этом область, в которой Java имеет преимущество перед Kotlin.
Встроенная поддержка делегирования
Kotlin, в отличие от Java, поддерживает шаблон проектирования «композиция вместо наследования» посредством первоклассного делегирования (иногда называемого неявным делегированием). Делегирование — это когда принимающий объект делегирует операции второму объекту-делегату, который является вспомогательным объектом с исходным контекстом.
Делегирование класса Kotlin — это альтернатива наследованию, позволяющая использовать множественное наследование. Между тем, делегированные свойства Kotlin помогают предотвратить дублирование кода, например, если вам нужно повторно использовать один и тот же код для нескольких методов получения и установки свойств, вы можете извлечь этот код в делегированное свойство. Делегат свойства должен определить операторную функцию getValue и, необязательно, оператор setValue:
class Delegate {
operator fun getValue(...)
...
...
...
}
operator fun setValue(...)
...
...
...
}
}
Затем, когда вы создаете свойство, вы можете объявить, что функции получения и установки для этого конкретного свойства обрабатываются другим классом:
class MyClass {
var property: String by Delegate()
}
Классы данных
Нет ничего необычного в том, что в проекте есть несколько классов, которые ничего не делают, кроме хранения данных. В Java вы обнаружите, что пишете много стандартного кода для этих классов, хотя сами классы имеют очень мало функциональных возможностей. Как правило, вам потребуется определить конструктор, поля для хранения данных, функции получения и установки для каждого поля, а также функции hashCode(), equals() и toString().
В Kotlin, если вы включите ключевое слово data в определение класса, компилятор выполнит всю эту работу за вас, включая создание всех необходимых геттеров и сеттеров:
data class Date(var month:String, var day: Int)
Умные приведения
В Java вам часто приходится проверять тип, а затем приводить объект в ситуациях, когда уже ясно, что объект может быть приведен.
Интеллектуальные приведения Kotlin могут обрабатывать эти избыточные приведения за вас, поэтому вам не нужно выполнять приведение внутри оператора, если вы уже проверили его с помощью оператора Kotlin «is». Например, компилятор знает, что следующее приведение безопасно:
if (hello is String) {
printString(hello)
}
Поддержка конструкторов
В отличие от Java, класс Kotlin может иметь первичный конструктор и один или несколько вторичных конструкторов, которые вы создаете, включая их в объявление класса:
class MainActivity constructor(firstName: String) {
}
Нет поддержки неявных расширяющих преобразований
Kotlin не поддерживает неявные расширяющие преобразования для чисел, поэтому меньшие типы не могут быть неявно преобразованы в большие типы. В Kotlin, если вы хотите присвоить значение типа Byte переменной Int, вам нужно выполнить явное преобразование, тогда как Java поддерживает неявные преобразования.
Библиотеки обработки аннотаций с Kotlin
Kotlin поддерживает все существующие платформы и библиотеки Java, включая расширенные платформы, основанные на обработке аннотаций, хотя некоторые библиотеки Java уже предоставляют расширения Kotlin, такие как RxKotlin.
Если вы хотите использовать библиотеку Java, основанную на обработке аннотаций, то добавление ее в проект Kotlin немного отличается, так как вам нужно будет указать зависимость с помощью подключаемого модуля kotlin-kapt , а затем использовать инструмент обработки аннотаций Kotlin ( kapt) вместо annotationProcessor. Например:
//Apply the plugin//
apply plugin: 'kotlin-kapt'
//Add the respective dependencies using the kapt configuration//
dependencies {
kapt "com.google.dagger:dagger-compiler:$dagger-version"
...
...
...
}
Взаимозаменяемость с Java
Обсуждая, использовать ли Kotlin или Java для разработки Android, вы должны знать, что есть третий вариант: использовать оба. Несмотря на все различия между двумя языками, Java и Kotlin совместимы на 100%. Вы можете вызывать код Kotlin из Java, и вы можете вызывать код Java из Kotlin, поэтому можно иметь классы Kotlin и Java рядом в одном проекте, и все равно все будет компилироваться.
Эта гибкость для переключения между двумя языками полезна, когда вы начинаете работу с Kotlin, поскольку она позволяет постепенно внедрять Kotlin в существующий проект, но вы также можете предпочесть использовать оба языка на постоянной основе. Например, могут быть определенные функции, которые вы предпочитаете писать на Kotlin, и определенные функции, которые вам проще написать на Java. Поскольку Kotlin и Java компилируются в байт-код, ваши конечные пользователи не смогут сказать, где заканчивается ваш код Java и начинается код Kotlin, поэтому нет причин, по которым вы не можете выпустить приложение, состоящее из Java и Kotlin.
Если вы хотите попробовать Kotlin самостоятельно, то, если у вас установлена версия Android Studio 3.0 или выше, вы можете начать работу несколькими способами:
- Создайте новый проект Android Studio. Самый простой способ — создать новый проект и установить флажок «Включить поддержку Kotlin» в мастере создания проекта.
- Добавьте класс Kotlin в существующий каталог. Удерживая клавишу Control, щелкните нужный каталог, затем выберите «Файл» > «Создать» > «Kotlin File/Class». Android Studio отобразит баннер с просьбой настроить ваш проект для поддержки Kotlin; щелкните ссылку «Настроить» и следуйте инструкциям на экране.
- Преобразуйте существующие файлы Java в Kotlin. Вы можете запустить любой файл Java через конвертер Kotlin, щелкнув файл, удерживая клавишу Control, и выбрав «Код > Преобразовать файл Java в файл Kotlin».
Подведение итогов
Как видите, есть много веских причин предпочесть Kotlin Java, однако есть несколько областей, в которых Java имеет преимущество. Возможно, наиболее примечательно то, что на данный момент многие разработчики Android просто лучше знакомы с Java. Скорее всего, дебаты Kotlin и Java не будут решены в ближайшее время, поскольку у обоих есть свои достоинства. Итак, собираетесь ли вы перейти на Kotlin или считаете, что Java по-прежнему остается лучшим вариантом для разработки под Android? Дайте нам знать об этом в комментариях!
Читайте далее: Учебник по Kotlin для Android для начинающих: создание простого теста