Многие новички (и не только) живут с убеждением, что ключевое слово
val гарантирует неизменяемость данных. Но так ли это на самом деле?В недавней статье на ProAndroidDev разбирают популярное заблуждение:
val - это read-only (доступ только для чтения), но никак не immutable (неизменяемость).Вот два кейса, когда ваш «неизменяемый»
val может измениться:1️⃣ Изменяемость самого объекта
val гарантирует только то, что ссылка на объект останется той же. Но если объект внутри изменяемый - его состояние можно менять без проблем.
val list = mutableListOf(1, 2, 3)
list.add(4) // Ссылка та же, содержимое изменилось
2️⃣ Кастомные геттеры
Это самый коварный момент. Свойство
val может возвращать разные значения при каждом обращении, если у него переопределен get().
val random: Int
get() = Random.nextInt()
В статье также приводят интересную статистику: в опросе 41% разработчиков ответили, что считают
val именно immutable, что технически неверно.По-настоящему неизменяемым объект становится только тогда, когда он состоит из примитивов или других неизменяемых объектов (например, Data Class, где все поля
val и нет ссылок на мутабельные типы).https://proandroiddev.com/the-val-property-immutable-in-kotlin-2e4cf49207d0
✍️ @kotlin_lib
