2014-12-15 3 views
0

Я загрузил исходный код для Google Guava только из любопытства, чтобы узнать, что поддерживает неизменные коллекции.Guava ImmutableList ... что именно это поддерживает?

Я шел через ImmutableList, и я заметил, что она по-прежнему опирается на старомодном массиве, как в Object[]

Так что я просто интересно, то Object[] массив, вероятно, изменяемый по своей природе, и он не является потокобезопасным. Я уже знал, что ArrayList и CopyOnWriteArrayList были подкреплены массивом Object[], но они изменяемы.

Так что ImmutableList является неизменным и потокобезопасным, потому что его внутренние свойства хорошо инкапсулированы и защищены? Является ли он также неизменным и потокобезопасным, потому что инкапсуляция гарантирует, что ничто не изменит его после строительства? Будет ли когда-нибудь такой день, когда низкоуровневые массивы вроде этого будут отключены для чего-то лучшего, а не из наследия, и будут неотъемлемо неизменными и окончательными, а не непреложными, путем тщательной инкапсуляции?

+2

Зачем им нужно добавлять неизменяемые массивы, если работает тщательная инкапсуляция? (И вам нужно только написать тщательную инкапсуляцию * один раз *). – immibis

+2

Альтернативная точка зрения: они добавили неизменяемые массивы. Их называют «ImmutableList». – immibis

+6

Другой способ взглянуть на это: память кучи все изменчива, и то, что делает ее неизменной, - «только тщательная инкапсуляция». Неизбежные массивы низкого уровня могут быть полезны для чего-то, но им не требуется внедрять неизменяемые списки, если для этого достаточно инкапсуляции. Если вы намерены не мутировать что-то, и язык позволяет вам пометить его неизменным, это похоже на тест времени компиляции, который вы никогда не случайно его мутируете. –

ответ

10

Да, ImmutableList является «единственным» неизменным, поскольку он не позволяет изменять его внутренний массив опор.

Это точно такая же ситуация, как для java.lang.String, которая также обертывает частный char[]. В то же время очень полезные библиотеки параллелизма в основном реализуются как обычные классы Java, основанные на очень немногих (и очень простых) примитивах синхронизации JVM.

Так что это должно быть достаточно хорошо. Очевидно, что люди, пишущие эти классы библиотеки, должны быть осторожными и узнаваемыми, но это требование не волшебным образом уходит, перемещая код еще более «низкоуровневым» в примитивы JVM. (Согласен, вы можете стрелять себе в ногу, используя темное отражение вуду, но это вряд ли происходит случайно, и при регулярном использовании также реализуется реализация «пользовательская земля»).

Будет ли когда-нибудь день

Это чистая спекуляция. Но, по-видимому, работа над «типами ценностей», которая является связанной темой.

Смежные вопросы