Ответ вслух Middle Коллекции и последовательности обновлено

Read-only и неизменяемые коллекции

Вопрос

Чем в Kotlin отличаются List, MutableList и по-настоящему неизменяемый список? Как защитить состояние класса?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

List в Kotlin это интерфейс без методов изменения. Он защищает от изменения через эту конкретную ссылку, но не гарантирует, что список никто не поменяет: под ним может лежать ArrayList, на который есть ссылка MutableList, а приведение as MutableList вообще сработает.

Что должно прозвучать в ответе

  • `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 ошибок.