0Pricing
Android Academy · Урок

Безопасные вызовы и Elvis

Операторы ?. и ?:.

«Безопасные вызовы и Elvis» — бесплатный урок Android Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.

Помимо проверок if

Проверять каждое значение, допускающее null, с помощью if можно, но код быстро становится многословным. В Kotlin есть компактные операторы, предназначенные для обработки null.

В этом уроке рассматриваются оператор безопасного вызова ?. и оператор Элвиса ?: — два инструмента, которые Вы будете использовать постоянно.

Оператор безопасного вызова

Оператор ?. вызывает метод только в том случае, если значение не равно null. Если оно равно null, всё выражение принимает значение null, а не приводит к сбою.

Это безопасное сокращение для шаблона «если не null».

fun main() {
    val name: String? = "Coddy"
    println(name?.length)
}

Безопасный вызов для null

Если получатель равен null, безопасный вызов прекращается и возвращает null. Исключение не возникает.

Здесь выводится слово null, а не сообщение о сбое.

fun main() {
    val name: String? = null
    println(name?.length)  // prints: null
}

Цепочки безопасных вызовов

Можно объединять несколько операторов ?. в цепочку. Если любое звено равно null, вся цепочка останавливается и возвращает null.

Это идеально подходит для доступа к вложенным необязательным данным.

class Address(val city: String?)
class User(val address: Address?)

fun cityOf(u: User?): String? {
    return u?.address?.city
}

Оператор Элвиса

Оператор Элвиса ?: подставляет запасное значение, если левая часть равна null. Он назван в честь причёски певца, на которую похож этот символ.

Читайте его так: используйте левое значение, иначе используйте правое.

fun main() {
    val name: String? = null
    val shown = name ?: "Guest"
    println(shown)  // prints: Guest
}

Элвис с безопасными вызовами

Безопасный вызов и оператор Элвиса отлично работают вместе. Используйте ?., чтобы обратиться к значению, и ?:, чтобы задать значение по умолчанию, если на каком-либо этапе встретился null.

Этот шаблон превращает результат, допускающий null, в гарантированно не-null значение.

fun main() {
    val name: String? = null
    val len: Int = name?.length ?: 0
    println(len)  // prints: 0
}

Пример длины со значением по умолчанию

Здесь тип результата — обычный Int, а не Int?. Оператор Элвиса устранил возможность null.

После ?: с запасным значением, не допускающим null, компилятор знает, что значение никогда не будет null.

val title: String? = "Kotlin"
val length: Int = title?.length ?: 0
// length is a non-null Int

Элвис для досрочного возврата

Поскольку return и throw в Kotlin являются выражениями, их можно поместить справа от оператора Элвиса.

Это удобный способ досрочно завершить выполнение, если отсутствует обязательное значение.

fun process(input: String?) {
    val text = input ?: return
    println(text.uppercase())
}

Безопасный вызов с let

Объедините ?. с let, чтобы выполнить блок только тогда, когда значение не равно null. Внутри блока значение не допускает null и называется it.

Это распространённый приём работы с необязательными значениями.

fun main() {
    val email: String? = "a@b.com"
    email?.let {
        println("Sending to " + it)
    }
}

Объединяем всё вместе

Небольшая программа может показать, как безопасный вызов и оператор Элвиса вместе создают понятное сообщение.

Обратите внимание: оператор if не нужен, и при этом код никогда не рискует завершиться сбоем из-за null.

fun main() {
    val nickname: String? = null
    val display = nickname?.uppercase() ?: "ANONYMOUS"
    println(display)
}

Когда что использовать

Используйте ?., когда нужно безвредно передать результат null дальше. Используйте ?:, когда нужно заменить null конкретным значением по умолчанию.

Вместе они охватывают почти все повседневные случаи обработки null без многословных проверок.

val count = list?.size ?: 0
// safe call reads size, Elvis defaults to 0

Быстрая проверка

Проверьте, насколько хорошо Вы понимаете безопасные вызовы и оператор Элвиса.

Итоги

Безопасный вызов ?. вызывает член только в том случае, если получатель не равен null; в противном случае результатом становится null. Оператор Элвиса ?: заменяет null запасным значением.

Объединение этих операторов позволяет аккуратно убрать возможность null. Далее Вы подробнее изучите функции области видимости, такие как let и also.

Часто задаваемые вопросы

Урок «Безопасные вызовы и Elvis» бесплатный?

Да — полный текст урока «Безопасные вызовы и Elvis» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.

Чему я научусь в уроке «Безопасные вызовы и Elvis»?

Операторы ?. и ?:. Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Android Academy?

Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Безопасные вызовы и Elvis»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Android Academy?

Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Допускающие null и ненулевые типы
  2. Безопасные вызовы и Elvis
  3. Функции let, also и области видимости
  4. Как избежать NullPointerExceptions
← Назад к Android Academy