Я загрузил исходный код для Google Guava только из любопытства, чтобы узнать, что поддерживает неизменные коллекции.Guava ImmutableList ... что именно это поддерживает?
Я шел через ImmutableList, и я заметил, что она по-прежнему опирается на старомодном массиве, как в Object[]
Так что я просто интересно, то Object[]
массив, вероятно, изменяемый по своей природе, и он не является потокобезопасным. Я уже знал, что ArrayList и CopyOnWriteArrayList были подкреплены массивом Object[]
, но они изменяемы.
Так что ImmutableList является неизменным и потокобезопасным, потому что его внутренние свойства хорошо инкапсулированы и защищены? Является ли он также неизменным и потокобезопасным, потому что инкапсуляция гарантирует, что ничто не изменит его после строительства? Будет ли когда-нибудь такой день, когда низкоуровневые массивы вроде этого будут отключены для чего-то лучшего, а не из наследия, и будут неотъемлемо неизменными и окончательными, а не непреложными, путем тщательной инкапсуляции?
Зачем им нужно добавлять неизменяемые массивы, если работает тщательная инкапсуляция? (И вам нужно только написать тщательную инкапсуляцию * один раз *). – immibis
Альтернативная точка зрения: они добавили неизменяемые массивы. Их называют «ImmutableList». – immibis
Другой способ взглянуть на это: память кучи все изменчива, и то, что делает ее неизменной, - «только тщательная инкапсуляция». Неизбежные массивы низкого уровня могут быть полезны для чего-то, но им не требуется внедрять неизменяемые списки, если для этого достаточно инкапсуляции. Если вы намерены не мутировать что-то, и язык позволяет вам пометить его неизменным, это похоже на тест времени компиляции, который вы никогда не случайно его мутируете. –