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

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

Компании: Одноклассники

Стек: Kotlin, Android

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

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

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

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

Kotlin вводит null-safety как часть системы типов. Обычный тип String не может содержать null - компилятор это запретит. Тип String? явно разрешает null. Это отличие от Java, где любая ссылка может быть null, и ошибки NullPointerException обнаруживаются только в рантайме.

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

  • оператор безопасного вызова ?. - вызывает метод или обращается к свойству, если значение не null, иначе возвращает null;
  • элвис-оператор ?: - возвращает значение слева, если оно не null, иначе значение справа;
  • оператор !! - утверждает, что значение не null, иначе выбрасывает NullPointerException (использовать осторожно);
  • smart cast - после проверки if (x != null) компилятор автоматически приводит тип к не-nullable внутри блока;
  • функции let, also, run, apply - позволяют выполнять код только при не-null значении.

Также важно понимать разницу между nullable-типами и платформенными типами (String!), которые приходят из Java - Kotlin не знает, могут ли они быть null, и не накладывает проверок.

На практике

В Android-разработке nullable типы встречаются повсеместно: данные из Bundle, аргументы фрагментов, результаты запросов, поля из JSON. Правильная работа с ними предотвращает краши приложения.

Типичный паттерн - использование let для выполнения действия только при не-null значении:

user?.let { 
    showName(it.name) 
}

Для установки значения по умолчанию используется ?::

val name = userName ?: "Гость"

При работе с Android API часто приходится использовать !!, например при обращении к view из onCreate, но это оправдано только когда вы уверены в не-null значении.

Пример кода

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

fun describeUser(user: User?) {
    // безопасный вызов и элвис-оператор
    val name = user?.name ?: "Неизвестно"
    
    // проверка с smart cast
    if (user?.age != null) {
        println("Возраст: ${user.age}") // smart cast сработал
    }
    
    // let для выполнения блока только при не-null
    user?.let {
        println("Пользователь: ${it.name}")
    }
    
    // использование !! - только при уверенности
    val age = user!!.age ?: 0
}

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

Начните с определения: nullable тип - это тип, который может принимать null. Затем перечислите основные операторы и объясните, зачем это нужно - предотвращение NullPointerException на этапе компиляции. Приведите пример из реальной практики, например работу с данными из Intent или Bundle. Покажите понимание trade-off: !! опасен, но иногда необходим. Упомяните разницу с Java и платформенными типами. Если спросят про производительность - отметьте, что проверки на null в Kotlin не создают накладных расходов в рантайме, так как компилятор генерирует обычные проверки.

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

Интервьюер оценивает:

  • понимание базовой концепции null-safety;
  • знание операторов ?., ?:, !! и когда их применять;
  • умение объяснить smart cast;
  • понимание отличий от Java;
  • способность применить знания в Android-контексте;
  • осознание опасности !! и умение её избегать.

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

  • использование !! без необходимости - это главный анти-паттерн;
  • забывание про smart cast после проверки вложенных свойств;
  • путаница между ?. и ?:;
  • непонимание, что платформенные типы из Java не дают гарантий;
  • попытка присвоить null не-nullable переменной без компиляционной ошибки;
  • игнорирование nullable-полей при работе с JSON-библиотеками, что приводит к крашам.

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

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