> Что такое 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- бросает.
> Похожие задачи по mobile
Что такое Kotlin Coroutines
Есть ли в Kotlin аналог equals и hashCode и как это реализовано
Что такое extension функции в Kotlin и как их использовать
Что такое data class в Kotlin и какие у него особенности
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью