ПрограммированиеBackend разработчик

В чем разница между ключевыми словами "val" и "var" в Kotlin? Как использовать их оптимально с точки зрения безопасности и производительности кода?

Проходите собеседования с ИИ помощником Hintsage

Ответ.

val и var — оба применяются для объявления переменных, но имеют принципиальные различия:

  • val (value): объявляет неизменяемую, только для чтения ссылку. После инициализации значение нельзя переназначить, ссылка остаётся навсегда на один объект:
val number = 42 // number = 10 // ошибка!
  • var (variable): объявляет изменяемую переменную;
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.