Что такое Unit и Nothing в Kotlin?

В Kotlin Unit и Nothing — это специальные типы, которые обозначают разные аспекты возвращаемого значения функции. Они похожи на void и bottom type в других языках, но с гораздо более точной и выразительной семантикой.

🔹 Unit — аналог void, но с объектом

Что это такое:

  • Тип Unit означает, что функция возвращает значение, но это значение не несёт полезной нагрузки.

  • В отличие от void в Java, в Kotlin Unit — это настоящий объект (у него есть единственное значение — Unit, с заглавной буквы).

Пример:

fun printMessage(message: String): Unit {
println(message)
}

Можно опустить : Unit, потому что это значение по умолчанию.

fun printMessage(message: String) {
println(message)
}

Фактически это то же самое, компилятор автоматически подставит Unit.

Особенности:

  • Unit имеет единственный экземпляр — Unit.

  • Вы можете возвращать Unit явно:

fun doNothing(): Unit = Unit
  • Используется часто в лямбдах без возвращаемого значения, например:
val action: () -> Unit = { println("Hi") }

🔸 Nothing — "тип, который не возвращает ничего никогда"

Что это такое:

  • Nothing — это bottom type в системе типов Kotlin.

  • Он обозначает, что функция никогда не завершится нормально (например, всегда выбрасывает исключение или вызывает exitProcess()).

Пример:

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

→ Эта функция никогда не вернёт управление вызывающему коду.

Особенности:

  • Используется для функций, которые не завершаются успешно.

  • Может использоваться в выражениях, чтобы гарантировать, что код после него будет недостижим.

  • Часто применяется в компиляторных оптимизациях и умной типизации.

Пример с возвратом:

val name: String? = null
val safeName: String = name ?: throw IllegalStateException("Name is null")

Оператор ?: работает потому, что throw имеет тип Nothing, а значит, совместим с любым типом (String в данном случае).

📊 Сравнение

Тип Описание
Unit Тип, возвращаемый функциями без полезного значения (аналог void)
--- ---
Nothing Тип, означающий невозможность вернуть что-либо (например, throw)
--- ---

🧠 Когда использовать

Unit:

  • В обычных функциях, которые ничего не возвращают.

  • В сигнатурах лямбд (() -> Unit).

  • В callback'ах (onClick: () -> Unit).

Nothing:

  • В функциях, которые всегда выбрасывают исключения.

  • В выражениях с throw, TODO(), error(), exitProcess().

  • Для обрыва цепочек вызова в безопасной типизации (?: throw ...).

  • В местах, где нужно остановить компиляцию при невозможном пути выполнения.

Примеры функций с Nothing

fun todo(): Nothing = TODO("Not implemented yet")
fun stop(): Nothing = exitProcess(1)

Итого

Тип Назначение Примеры использования
Unit Функция что-то делает, но ничего не возвращает fun log(msg: String): Unit
--- --- ---
Nothing Функция никогда не возвращает throw, TODO(), error(), exitProcess()
--- --- ---

Unit — про отсутствие полезного результата, Nothing — про невозможность вернуть что-либо вообще.