Read-only и неизменяемые коллекции
Вопрос
Чем в Kotlin отличаются List, MutableList и по-настоящему неизменяемый список? Как защитить состояние класса?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
`List` read-only интерфейс, не гарантия неизменяемости
На JVM оба это `java.util.List`
Наружу отдавать `List`, внутри держать `MutableList` или копировать
Настоящая неизменяемость: kotlinx.collections.immutable
В Compose стабильность: неизменяемые коллекции помогают пропускать рекомпозицию
Что могут спросить следом
- Что будет, если привести
ListкMutableList? - Почему
Listв Compose считается нестабильным типом?
Разбор
List в Kotlin это интерфейс без методов изменения. Он защищает от изменения через эту конкретную ссылку, но не гарантирует, что список никто не поменяет: под ним может лежать ArrayList, на который есть ссылка MutableList, а приведение as MutableList вообще сработает. На JVM оба интерфейса превращаются в java.util.List. Поэтому в классе я держу приватный MutableList или MutableStateFlow, а наружу отдаю List, и если важно, что получатель не увидит будущих изменений, отдаю копию через toList(). Когда нужна гарантия, использую kotlinx.collections.immutable с PersistentList. Это важно и в Compose: компилятор Compose считает обычный List нестабильным, а неизменяемые коллекции стабильными, что помогает пропускать рекомпозицию.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.