val и var — оба применяются для объявления переменных, но имеют принципиальные различия:
val number = 42 // number = 10 // ошибка!
var counter = 0 counter++ // разрешено
Безопасность и производительность:
val везде, где переменная не должна меняться — это защищает от случайных изменений и делает код легче для понимания.val позволяет компилятору и IDE ловить ошибки на этапе компиляции и оптимизировать код.Может ли объект, объявленный как
val, быть изменён?
Ответ: Значение самой переменной (ссылка) не может быть переназначено, но если это объект (например, список), его внутреннее состояние можно менять.
val list = mutableListOf(1,2) list.add(3) // Можно! А вот list = другойСписок будет ошибкой.
История
В проекте интернет-магазина разработчик определил список товаров как
val items = mutableListOf<Product>(), думая, что так список полностью неизменяем. На самом деле в другой части был изменён список (добавлен новый элемент), что неожиданно повлияло на отображение корзины.
История
В парсере больших текстовых файлов array-буфер был объявлен как
var buffer, хотя в процессе парсинга его не нужно было заменять. Случайно ошибочно произошло повторное присвоение новому массиву, что привело к утечке памяти и неверной обработке данных.
История
В коде одного микросервиса большинство переменных объявлялось как
var"на всякий случай", в итоге в больших выражениях иногда менялось состояние объекта в разных потоках, что привело к трудноуловимым багам из-за race condition.