Что такое 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 — про невозможность вернуть что-либо вообще.