В чём разница между val и var?
В Kotlin val и var — это ключевые слова, используемые для объявления переменных, и их главное различие — в изменяемости (mutability) значения переменной после инициализации.
🔹 val — неизменяемая переменная (immutable)
-
Значение переменной можно присвоить только один раз.
-
Аналог final в Java.
-
После инициализации попытка изменить значение приведёт к ошибке компиляции.
Пример:
val name = "Alice"
name = "Bob" // ❌ Ошибка: val cannot be reassigned
Когда использовать:
-
Когда переменная не должна меняться.
-
При работе с константами, конфигурациями, зависимостями.
-
Для безопасности и предсказуемости кода.
🔸 var — изменяемая переменная (mutable)
-
Значение можно переприсваивать любое количество раз.
-
Используется, когда переменная должна изменяться в процессе выполнения.
Пример:
var counter = 0
counter += 1
counter = 42 // ✅ Работает
Когда использовать:
-
Если значение переменной может измениться с течением времени.
-
Например, счётчики, флаги, временные буферы и т. д.
🧠 Сравнение val и var
Ключевое слово | Изменяемость | Присваивание | Подходит для |
---|---|---|---|
val | ❌ Нет | Один раз | Константы, ссылки, безопасный код |
--- | --- | --- | --- |
var | ✅ Да | Много раз | Состояние, переменные данные |
--- | --- | --- | --- |
⚠️ Важно: val не делает объект неизменяемым
Если val ссылается на изменяемый объект, сам объект можно менять, но нельзя переназначить ссылку.
Пример:
val list = mutableListOf(1, 2, 3)
list.add(4) // ✅ Можно
list = mutableListOf(5, 6) // ❌ Ошибка: нельзя переназначить
Типичный стиль Kotlin
Kotlin ориентирован на immutability по умолчанию, поэтому рекомендуется:
-
Всегда использовать val, если переменная не будет изменяться.
-
Использовать var только там, где это действительно нужно.
Это делает код безопаснее, проще для чтения и тестирования, особенно в многопоточности и функциональном программировании.
Итого
val | var |
---|---|
Неизменяемая ссылка (как final) | Изменяемая ссылка |
--- | --- |
Присваивается один раз | Можно менять значение сколько угодно |
--- | --- |
Предпочтителен для большинства случаев | Используется при необходимости изменения |
--- | --- |
val = value (значение), var = variable (переменная).