Безопасные вызовы и 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 — локальная установка не требуется.
Все уроки этого курса
- Допускающие null и ненулевые типы
- Безопасные вызовы и Elvis
- Функции let, also и области видимости
- Как избежать NullPointerExceptions