> Что такое nullable типы в Kotlin и как с ними работать (Kotlin)

Уровень: junior · Роль: mobile · Категория: Технические вопросы

Компании: ЛИПТ Софт

Стек: Kotlin

> Пример ответа

Короткий ответ

Nullable типы в Kotlin - это типы, которые могут хранить null. Обозначаются знаком ? после типа, например String?. Это часть системы безопасности от null-pointer exceptions: компилятор запрещает использовать nullable значение без явной проверки. Работать с ними можно через операторы ?., ?:, !!, а также через safe cast и функции вроде let, run, apply. Основная идея - сделать null-обработку явной и безопасной на уровне типов.

Подробное объяснение

В Kotlin каждый тип по умолчанию non-nullable - переменная не может содержать null, если тип не объявлен с ?. Например, String не может быть null, а String? - может. Это решает проблему NPE на этапе компиляции.

Основные инструменты работы:

  • Оператор ?. - безопасный вызов. Если объект null, выражение возвращает null, иначе выполняется вызов. Например, str?.length вернёт null для null-строки.
  • Оператор ?: - elvis-оператор. Возвращает левую часть, если она не null, иначе правую. Например, str?.length ?: 0.
  • Оператор !! - утверждение non-null. Бросает NullPointerException, если значение null. Используется только когда уверен, что null невозможен.
  • Safe cast as? - возвращает null, если приведение невозможно, вместо исключения.
  • Функции области видимости - let, run, apply, also, with. Например, str?.let { println(it.length) } выполнит блок только если str не null.

Также есть lateinit для свойств, которые инициализируются позже, и lazy для отложенной инициализации.

На практике

На практике nullable типы встречаются повсеместно: при работе с API (поля JSON могут отсутствовать), с Android SDK (многие методы возвращают nullable), с базами данных. Главное правило - не использовать !! без крайней необходимости, так как это возвращает риск NPE. Лучше применять ?. и ?: для безопасной обработки.

Для цепочек вызовов удобно использовать ?. - если любой элемент цепочки null, вся цепочка вернёт null. Для преобразования nullable в non-null с дефолтным значением - ?:. Для выполнения действия только при non-null - let.

Пример кода

data class User(val name: String?, val age: Int?)

fun main() {
    val user = User("Alice", null)
    
    // Безопасный вызов
    val nameLength = user.name?.length  // 5
    
    // Elvis-оператор с дефолтным значением
    val age = user.age ?: 0  // 0
    
    // Выполнение блока только если name не null
    user.name?.let { 
        println("Name is $it") 
    }
    
    // Цепочка вызовов
    val city = getUser()?.address?.city ?: "Unknown"
    
    // Safe cast
    val number = "123" as? Int  // null, так как String не Int
    
    // !! - только если уверены
    val mustNotBeNull = user.name!!
}

Как отвечать на собеседовании

Начни с определения: nullable тип - это тип, который может содержать null, обозначается ?. Подчеркни, что это фича безопасности компилятора. Затем перечисли основные операторы и их назначение. Приведи короткий пример из практики - например, работа с полем из JSON. Упомяни, что !! - это антипаттерн в большинстве случаев. Если спросят про lateinit - объясни, что это для свойств, которые инициализируются позже, и что обращение до инициализации бросит исключение.

Что проверяет интервьюер

Интервьюер проверяет:

  • Понимание базовой концепции null-safety в Kotlin.
  • Знание операторов ?., ?:, !! и их отличий.
  • Умение применять функции let и другие scope-функции.
  • Понимание trade-off между безопасностью и производительностью (например, !! быстрее, но опаснее).
  • Способность объяснить, когда какой инструмент использовать.

Типичные ошибки

  • Использование !! без необходимости - главный антипаттерн.
  • Путаница между ?. и ?: - первый для вызовов, второй для значений по умолчанию.
  • Забывание, что ?. возвращает null, а не выполняет действие - для действий нужен let.
  • Попытка использовать nullable тип без проверки в non-null контексте - компилятор не даст.
  • Непонимание, что as? не бросает исключение, а as - бросает.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью