Шаг 124.
Основы Kotlin.
Списки и множества. Использование "только для чтения" вместо "неизменяемого"

    На этом шаге мы рассмотрим различие между этими понятиями.

    Везде мы используем термин "только для чтения" вместо "неизменяемый", за исключением пары случаев, но не объясняем почему. Время пришло. "Неизменяемый" неправильно отражает суть коллекций Kotlin (и некоторых других типов), потому что они могут изменяться. Рассмотрим несколько примеров списков.

    Вот объявление двух List. Переменные, ссылающиеся на списки, доступны только для чтения, потому что объявлены как val. Но каждая из них содержит изменяемый список.

  val x = listOf(mutableListOf(1, 2, 3)) 
  val y = listOf(mutableListOf(1, 2, 3))
  
  x == y 
  true

    Пока ничего особенного. Переменным x и y присвоены одинаковые значения, и тип List не предлагает никаких функций для манипуляций с самой ссылкой на список.

    Но переменные ссылаются на изменяемые списки, а их содержимое может быть изменено:

  val x = listOf(mutableListOf(1, 2, 3)) 
  val y = listOf(mutableListOf(1, 2, 3)) 
  x[0].add(4)
  
  x == y 
  false

    Структурное сравнение x и y вернуло ложь, потому что содержимое x изменилось. Должно ли неизменяемое значение себя так вести? По нашему мнению, не должно.

    Вот еще один пример:

  var myList: List<Int> = listOf(1, 2, 3)
  (myList as MutableList)[2] = 1000 
  
  myList 
  [1, 2, 1000]

    В этом примере myList был приведен к типу MutableList, чтобы сообщить компилятору, что тот должен относиться к myList как к изменяемому списку, несмотря на то что он был создан с помощью listOf. Приведение типа позволило изменить третье значение в myList. И вот мы снова видим не то поведение, которое ожидали от чего-то, отмеченного как "неизменное".

    Тип List в Kotlin не является строго неизменяемым - вы сами выбираете, использовать ли его в неизменяемой манере. "Неизменяемость" List в Kotlin - это лишь тонкая обертка, и что бы вы ни делали, не забывайте об этом.

    На следующем шаге мы приведем несколько заданий для самостоятельного решения.




Предыдущий шаг Содержание Следующий шаг