Интерфейс Collection: коллекции представлений, неизменяемые коллекции

Коллекции представлений

Большинство коллекций управляют хранением содержащихся в них элементов. Напротив, коллекции представлений (view collections) сами по себе не хранят элементы, а вместо этого полагаются на вспомогательную коллекцию для хранения фактических элементов. Операции, которые не обрабатываются самой коллекцией представлений, делегируются вспомогательной коллекции. Примеры коллекций представлений включают коллекции оболочек, возвращаемые такими методами, как Collections.checkedCollection, Collections.synchronizedCollection и Collections.unmodifiableCollection. Другие примеры коллекций представлений включают коллекции, которые обеспечивают другое представление одних и тех же элементов, например, предоставляемое List.subList, NavigableSet.subSet или Map.entrySet. Любые изменения, внесенные в вспомогательную коллекцию, отображаются в коллекции представлений. Соответственно, любые изменения, внесенные в коллекцию представлений - если изменения разрешены - записываются в вспомогательную коллекцию. Хотя они технически не являются коллекциями, экземпляры Iterator и ListIterator также могут разрешать запись изменений в вспомогательную коллекцию, и в некоторых случаях изменения в вспомогательной коллекции будут видны Iterator во время итерации.

Неизменяемые коллекции

Некоторые методы этого интерфейса считаются «деструктивными» и называются методами «мутатора», поскольку они изменяют группу объектов, содержащихся в коллекции, с которой они работают. Их можно указать для создания исключения UnsupportedOperationException, если эта реализация коллекции не поддерживает операцию. Такие методы должны (но не обязаны) вызывать исключение UnsupportedOperationException, если вызов не повлияет на коллекцию. Например, рассмотрим коллекцию, которая не поддерживает операцию добавления. Что произойдет, если для этой коллекции будет вызван метод addAll с пустой коллекцией в качестве аргумента? Добавление нулевых элементов не имеет никакого эффекта, поэтому для этой коллекции допустимо просто ничего не делать и не вызывать исключения. Однако рекомендуется, чтобы такие случаи вызывали исключение безоговорочно, так как выброс только в определенных случаях может привести к ошибкам программирования.

Неизменяемая коллекция - это коллекция, все методы мутатора которой (как определено выше) указаны для создания исключения UnsupportedOperationException. Таким образом, такая коллекция не может быть изменена путем вызова каких-либо методов. Чтобы коллекция была неизменяемой должным образом, любые коллекции представлений, производные от нее, также должны быть неизменяемыми. Например, если List нельзя изменить, список, возвращаемый List.subList, также нельзя изменить.

Неизменяемая коллекция не обязательно неизменяема. Если содержащиеся элементы являются изменяемыми, вся коллекция явно изменяема, даже если она может быть неизменяемой. Например, рассмотрим два неизменяемых списка, содержащих изменяемые элементы. Результат вызова list1.equals(list2) может отличаться от одного вызова к другому, если элементы были изменены, даже если оба списка не подлежат изменению. Однако, если неизменяемая коллекция содержит все неизменяемые элементы, ее можно считать фактически неизменной.

Неизменяемые коллекции представлений

Неизменяемая коллекция представлений - это неизменяемая коллекция, которая также является представлением для вспомогательной коллекции. Ее методы-мутаторы генерируют исключение UnsupportedOperationException, как описано выше, в то время как методы чтения и запросов делегируются вспомогательной коллекции. Эффект заключается в предоставлении доступа только для чтения к вспомогательной коллекции. Это полезно для компонента, чтобы предоставить пользователям доступ для чтения к внутренней коллекции, предотвращая при этом неожиданное изменение таких коллекций. Примеры неизменяемых коллекций представлений - это те, которые возвращаются Collections.unmodifiableCollection, Collections.unmodifiableList и связанными с ними методами.

Обратите внимание, что изменения в вспомогательной коллекции все еще возможны, и если они происходят, они видны через неизменяемое представление. Таким образом, неизменяемая коллекция представлений не обязательно является неизменной. Однако, если вспомогательная коллекция немодифицируемого представления является фактически неизменяемой или если единственная ссылка на вспомогательную коллекцию осуществляется через неизменяемое представление, представление можно считать фактически неизменяемым.

Этот интерфейс является членом Java Collections Framework.

Требования к реализации: Реализации метода по умолчанию (унаследованные или иные) не применяют никаких протоколов синхронизации. Если реализация Collection имеет конкретный протокол синхронизации, она должна переопределить реализации по умолчанию, чтобы применить этот протокол.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки