Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Элвис оператор (?:) в Kotlin
Элвис оператор — это синтаксический сахар для работы с null-значениями в Kotlin. Он назван так потому, что ?: похож на улыбку певца Элвиса Пресли, если повернуть голову на 90 градусов. Это один из самых полезных инструментов для null-safety в языке.
Базовый синтаксис
Элвис оператор возвращает левое значение, если оно не null, иначе возвращает правое значение:
val name: String? = null
val result = name ?: "Unknown"
println(result) // Output: Unknown
val age: Int? = 25
val result2 = age ?: 18
println(result2) // Output: 25
Сравнение с другими подходами
// ❌ Java-подобный способ (многословно)
val message = if (text != null) text else "Default"
// ✅ Элвис оператор (лаконично)
val message = text ?: "Default"
// ❌ Плохо — может быть NPE
val message = text!! // Падёт если null
// ✅ Хорошо — null-safe
val message = text ?: "Default"
Практические примеры
Работа с функциями, возвращающими null:
fun getUserName(): String? = null
// Без Элвиса
val name: String = if (getUserName() != null) getUserName()!! else "Guest"
// С Элвисом
val name: String = getUserName() ?: "Guest"
Цепочка проверок:
val result = getUserName() ?: getDefaultName() ?: "Unknown"
// Работает справа налево, пока не найдёт первое не-null значение
В функциях и методах:
fun getDisplayName(user: User?): String {
return user?.name ?: "Anonymous"
}
// Эквивалентно
fun getDisplayName(user: User?): String {
return if (user?.name != null) user.name else "Anonymous"
}
Комбинация с Safe Call Operator (?.) и Not-Null Assertion (!!)
data class User(val profile: Profile? = null)
data class Profile(val name: String? = null)
val user: User? = null
// Safe call + Элвис оператор (рекомендуется)
val displayName = user?.profile?.name ?: "Unknown"
// Not-null assertion (опасно!)
val displayName2 = user!!.profile!!.name!! // Может упасть с NPE
Сложные примеры использования
С инициализацией переменных:
val config: Config? = loadConfig()
val timeout = config?.timeout ?: 5000 // 5 секунд по умолчанию
val retryCount = config?.retries ?: 3
val maxConnections = config?.connections ?: 10
С коллекциями:
val items: List<String>? = null
val count = items?.size ?: 0
val firstItem = items?.firstOrNull() ?: "No items"
С логированием и обработкой ошибок:
fun saveUser(user: User?) {
val userId = user?.id ?: run {
logger.warn("User is null")
return // Ранний выход
}
database.save(userId)
}
Важные практики
Используй Элвис вместо double bang (!!)
// ❌ Опасно
val name = user!!.name
// ✅ Безопасно
val name = user?.name ?: "Unknown"
Цепочки null-проверок:
// Читаемо и безопасно
val email = user?.account?.email ?: user?.fallbackEmail ?: "no-email@example.com"
С require и check:
fun createUser(name: String?, age: Int?) {
val validName = name ?: throw IllegalArgumentException("Name cannot be null")
val validAge = age?.takeIf { it > 0 } ?: throw IllegalArgumentException("Age must be positive")
// Теперь validName и validAge точно не null
}
На собеседовании
Это один из самых часто используемых паттернов в Kotlin. При ответе подчеркните:
- Что это инструмент для null-safety (отличие от Java)
- Когда его использовать (вместо if-else, вместо !!)
- Как комбинировать с safe call operator (?.)
- Практические примеры из вашего опыта (конфиги, API ответы, БД запросы)
Элвис оператор — это не просто синтаксический сахар, это философия Kotlin: делать null-безопасный код естественным и читаемым.