В каком случае не стоит использовать MutableList при необходимости редактирования листа
Что проверяют
Понимаете ли вы, что в Android список почти всегда часть состояния, а изменение на месте ломает механизмы, которые реагируют на смену ссылки. Следом спрашивают, чем List в Kotlin отличается от по-настоящему неизменяемого списка и как обновлять состояние во ViewModel.
Как отвечать
Сама необходимость править данные не повод брать MutableList. Его не стоит использовать там, где кто-то следит за состоянием:
StateFlowиLiveData:_items.value.add(x)не вызовет эмиссию, ссылка та же.StateFlowсравнивает значения черезequals, поэтому даже присвоить тот же изменённый экземпляр бесполезно. Правильно держатьListи обновлять копией:_items.update { it + x };- Compose: обычный
mutableListOf()внутриrememberне вызывает рекомпозицию приadd. Нужен либоmutableStateListOf(), он жеSnapshotStateList, либо неизменяемый список вmutableStateOfс заменой целиком; ListAdapterиDiffUtil: если передать вsubmitListтот же изменённый экземпляр, адаптер решит, что ничего не поменялось. Нужен новый список;- публичный API класса: наружу отдают
List, аMutableListдержат в приватном поле, чтобы экран не менял данные в обходViewModel; - несколько потоков:
ArrayListне потокобезопасен. Изменение во время обхода даётConcurrentModificationException, одновременная запись теряет элементы. Здесь нужны неизменяемые снимки,Mutexв корутинах илиCopyOnWriteArrayListдля редких записей.
Уточните, что List в Kotlin только интерфейс для чтения: под ним может лежать тот же ArrayList, и приведение типа позволит его изменить. Настоящую неизменяемость даёт kotlinx.collections.immutable с persistentListOf(), а в Compose ImmutableList ещё и считается стабильным типом.
Где спотыкаются
Мутируют список внутри StateFlow и удивляются, что экран не обновился. Это самая частая ошибка в тестовых заданиях.
Считают, что List защищает от изменений. Это защита на уровне компилятора, а не самого объекта.
Советуют Collections.synchronizedList как универсальное решение. Он защищает отдельные вызовы, но обход списка всё равно требует внешней синхронизации.