← Назад к вопросам

Что такое Элвис оператор?

1.3 Junior🔥 171 комментариев
#Kotlin основы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Элвис оператор (?:) в 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-безопасный код естественным и читаемым.

Что такое Элвис оператор? | PrepBro