17 мая 2017 года на конференции Google I/O было объявлено об официальной поддержке языка Kotlin для разработки Android-приложений. Первый релиз языка вышел 15 февраля 2016 года. Плагин для поддержки Kotlin теперь входит в поставку Android Studio 3.0 (релиз этой версии студии состоялся 25 октября 2017 года). Так что теперь, очевидно, Котлин стал наиболее перспективным языком программирования под Android.
Основное преимущество Котлина над Java — компактность исходного кода. Объёмы исходников сокращаются почти наполовину, что не может не радовать, поскольку Java-запись всегда напрягала своей размашистостью.
Кое-что про Котлин я уже недавно писал в своём основном блоге. Теперь же я хочу остановиться на некоторых особенностях языка.
Переход с Java на Котлин можно осуществлять постепенно. В одном проекте можно совмещать файлы на обоих языках. Кроме того, писать на Котлин можно в стиле Java. Правда, тогда теряется его основное преимущество — компактность исходника, поэтому я бы рекомендовал сразу привыкать к новому синтаксису.
В исходниках Котлина прежде всего бросаются в глаза используемые то тут, то там, знаки вопроса. Давайте рассмотрим, что это такое, и зачем их используют.
Обращение к полю null-объекта
Что сразу бросается в глаза в нижеприведённом примере?
Да, знаки вопроса перед операторами вызова (точками), а вовсе не фамилия putin. Знаки вопроса — это общее проявление null-безопасности языка. В приведённом примере без знака вопроса Android Studio укажет на ошибку, потому что если в одном из явно не инициализированных полей будет null, то программа выбросит исключение NullPointerException.
Оператор безопасного вызова ?. позволяет перед обращением к следующему полю проверить значение текущего поля на null, и обратиться дальше только в случае непустого его значения. В противном же случае вся конструкция просто возвращает null и не выбрасывает никакого исключения.
Тем не менее, если нужно вернуться к исключениям, достаточно вместо ? поставить !!
Оператор !! — это как бы обещание программиста, что на момент вызова поле точно не будет иметь значение null. Иначе, как уже было сказано, в процессе выполнения программы возникнет исключение NullPointerException.
Типы данных и null
По умолчанию все типы данных в Котлин не могут содержать null. Чтобы разрешить типу данных содержать null, после указания типа ставится знак вопроса:
Присваивание заведомо непустого значения переменной:
В случае пустого поля b в переменную len возвращается -1. Иначе возвращается длина объекта b. Для этого служит оператор «Элвис» ?: названный так за схожесть получившегося смайлика с причёской Элвиса Пресли.
В случае невозможности привести типы исключение ClassCastException не возникает и возвращается null:
Если unknownTypeVar можно привести к типу Int, то integerVar = unknownTypeVar, иначе integerVar = null.
Коллекции. Фильтрация null-значений
Из одной коллекции, имеющей среди значений null, можно перенести в другую коллекцию только не-null значения. Для этого у коллекции есть метод фильтра filterNotNull:
Метод let. Быстрая проверка на null
Выполнить код только в том случае, если используемая переменная не равна null, можно с помощью оператора безопасного вызова ?. и метода let:
Если apple не null, выполнить т.н. «лямбда-выражение» в фигурных скобках, куда значение apple передано через it. Про лямбда-выражение читайте в следующей части.
Основное преимущество Котлина над Java — компактность исходного кода. Объёмы исходников сокращаются почти наполовину, что не может не радовать, поскольку Java-запись всегда напрягала своей размашистостью.
Кое-что про Котлин я уже недавно писал в своём основном блоге. Теперь же я хочу остановиться на некоторых особенностях языка.
Переход с Java на Котлин можно осуществлять постепенно. В одном проекте можно совмещать файлы на обоих языках. Кроме того, писать на Котлин можно в стиле Java. Правда, тогда теряется его основное преимущество — компактность исходника, поэтому я бы рекомендовал сразу привыкать к новому синтаксису.
В исходниках Котлина прежде всего бросаются в глаза используемые то тут, то там, знаки вопроса. Давайте рассмотрим, что это такое, и зачем их используют.
Null-безопасность
Обращение к полю null-объекта
Что сразу бросается в глаза в нижеприведённом примере?
val phone = phoneBook?.presidents?.putin?.phone
Да, знаки вопроса перед операторами вызова (точками), а вовсе не фамилия putin. Знаки вопроса — это общее проявление null-безопасности языка. В приведённом примере без знака вопроса Android Studio укажет на ошибку, потому что если в одном из явно не инициализированных полей будет null, то программа выбросит исключение NullPointerException.
Оператор безопасного вызова ?. позволяет перед обращением к следующему полю проверить значение текущего поля на null, и обратиться дальше только в случае непустого его значения. В противном же случае вся конструкция просто возвращает null и не выбрасывает никакого исключения.
Тем не менее, если нужно вернуться к исключениям, достаточно вместо ? поставить !!
val phone = phoneBook!!.presidents!!.putin!!.phone
Оператор !! — это как бы обещание программиста, что на момент вызова поле точно не будет иметь значение null. Иначе, как уже было сказано, в процессе выполнения программы возникнет исключение NullPointerException.
Типы данных и null
По умолчанию все типы данных в Котлин не могут содержать null. Чтобы разрешить типу данных содержать null, после указания типа ставится знак вопроса:
val str String? = null
Оператор «Элвис»
Присваивание заведомо непустого значения переменной:
val len = b?.length ?: -1
В случае пустого поля b в переменную len возвращается -1. Иначе возвращается длина объекта b. Для этого служит оператор «Элвис» ?: названный так за схожесть получившегося смайлика с причёской Элвиса Пресли.
Null-безопасность оператора as
В случае невозможности привести типы исключение ClassCastException не возникает и возвращается null:
val integerVar: Int? = unknownTypeVar as? Int
Если unknownTypeVar можно привести к типу Int, то integerVar = unknownTypeVar, иначе integerVar = null.
Коллекции. Фильтрация null-значений
Из одной коллекции, имеющей среди значений null, можно перенести в другую коллекцию только не-null значения. Для этого у коллекции есть метод фильтра filterNotNull:
val nullableList: List<int> = [1, 2, null, 4] val intList: List<int> = nullableList.filterNotNull()
Метод let. Быстрая проверка на null
Выполнить код только в том случае, если используемая переменная не равна null, можно с помощью оператора безопасного вызова ?. и метода let:
val fruitBasket = ... apple?.let { println("Добавление яблока в корзину!") fruitBasket.add(it) }
Если apple не null, выполнить т.н. «лямбда-выражение» в фигурных скобках, куда значение apple передано через it. Про лямбда-выражение читайте в следующей части.
Несколько раз перечитывал оф доки, но только сейчас все стало на свои места. Спасибо за статью!
ОтветитьУдалитьПожалуйста! :-)
Удалить