понедельник, 26 февраля 2018 г.

Язык Котлин. Часть 1. Null-безопасность.

17 мая 2017 года на конференции Google I/O было объявлено об официальной поддержке языка Kotlin для разработки Android-приложений. Первый релиз языка вышел 15 февраля 2016 года. Плагин для поддержки Kotlin теперь входит в поставку Android Studio 3.0 (релиз этой версии студии состоялся 25 октября 2017 года). Так что теперь, очевидно, Котлин стал наиболее перспективным языком программирования под Android.

Основное преимущество Котлина над 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. Про лямбда-выражение читайте в следующей части.

2 комментария:

  1. Несколько раз перечитывал оф доки, но только сейчас все стало на свои места. Спасибо за статью!

    ОтветитьУдалить