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

Сколько можно создать инстансов Nothing в приложении?

2.3 Middle🔥 61 комментариев
#JVM и память#Kotlin основы

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Сколько можно создать экземпляров Nothing?

В Kotlin Nothing — это специальный тип, который не имеет экземпляров (instances). Это так называемый "uninhabited type" (незаселённый тип). Поэтому ответ: 0 экземпляров. Создать экземпляр Nothing в явном виде невозможно — компилятор Kotlin запрещает это на уровне языка.

Почему нельзя создать экземпляр Nothing?

  1. Nothing является финальным классом с приватным конструктором, объявленным в стандартной библиотеке Kotlin:

    public class Nothing private constructor()
    

    Приватный конструктор блокирует создание экземпляров извне класса, а поскольку класс финальный — его нельзя унаследовать.

  2. Семантика типа Nothing:

    • Nothing представляет "значение, которого не существует".
    • Используется для обозначения операций, которые никогда не завершаются нормально:
     - Функции, которые всегда выбрасывают исключение.
     - Функции, которые заходят в бесконечный цикл.
  • Всякая ветка кода, возвращающая Nothing, считается недостижимой (unreachable) с точки зрения компилятора.

Практическое использование Nothing

1. Функции, которые всегда завершаются исключением

fun fail(message: String): Nothing {
    throw IllegalStateException(message)
}

fun example(name: String?) {
    val userName = name ?: fail("Name is required")
    // Компилятор знает, что если fail вызван, выполнение не продолжится
    // Поэтому userName здесь имеет тип String (не String?)
    println(userName.length) // Безопасно, без проверки на null
}

2. Как возвращаемый тип для бесконечных циклов

fun infiniteLoop(): Nothing {
    while (true) {
        println("Running...")
    }
}

3. В обобщённых типах (Generics) для обозначения отсутствия значения

val emptyList: List<Nothing> = listOf()
// Такой список нельзя создать с элементами, но его можно использовать
// как ковариантный пустой список любого типа
val strings: List<String> = emptyList // Корректно из-за ковариантности

4. Вместе с TODO() функциями

fun notImplementedYet(): Nothing = TODO("Реализовать позже")

Nothing vs Unit vs null

  • Unit — тип с одним возможным значением Unit, аналог void в Java.
  • Nothing — тип без значений, обозначает "ничего не вернётся никогда".
  • Nothing? — интересный нюанс: это nullable-версия, которая имеет ровно одно значениеnull. Это единственный случай, когда с Nothing можно работать с значением:
val nothingNull: Nothing? = null // Единственное возможное значение
// val x: Nothing = null // Ошибка компиляции!

Выводы

  • Создать экземпляр Nothing невозможно — это противоречит самой сути этого типа в системе типов Kotlin.
  • Nothing — это тип-мастер, который помогает компилятору выполнять анализ достижимости кода и обработку null-safety.
  • Использование Nothing делает код более типобезопасным, позволяя компилятору выводить дополнительные гарантии о поведении программы.

Таким образом, количество инстансов Nothing всегда равно нулю, что делает этот тип уникальным инструментом в системе типов Kotlin для моделирования недостижимого кода и исключительных ситуаций.

Сколько можно создать инстансов Nothing в приложении? | PrepBro