В чём разница между 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 (переменная).