Главная » Java » Неизменяемые оболочки коллекций

0

 

   В составе класса Collections имеются статические методы, возвращающие для заданных объектов коллекций неизменяемые оболочки (unmodifiable wrappers): unmodi fi ableCol1ecti on, unmodi fi ableSet, unmodi fi ableSortedSet, unmodifiableList, unmodifiablемар и unmodifiableSortedMap. Объекты-оболочки Названных типов свободно "пропускают" обращенные к "внутренней" коллекции вызовы методов, которые не изменяют ее содержимого, но активизация любого из методов, предполагающих воздействие на содержимое, приводит к выбрасыванию исключения UnsupportedOperationException. Как и в случае синхронизированных оболочек, содержимое неизменяемой оболочки поддерживается исходной коллекцией в актуальном состоянии: результат любого изменения данных коллекции оказывается "видимым" со стороны объекта-оболочки. Иными словами, содержимое неизменяемой оболочки коллекции на самом деле изменению поддается, но только не средствами самой оболочки.

   Неизменяемые оболочки — это удобный инструмент представления порций данных, не допускающих модификации. Рассмотрим следующий короткий фрагмент кода, применение которого чревато опасными последствиями:

 

public final   String suits[]  = { // ОПАСНО! "черви",   "трефы",   "Бубны",   "пики"}

 

Ссылка suits не допускает изменения — она всегда указывает на исходный массив. Но содержимое массива как такового вполне может быть модифицировано каким-нибудь проказником:

   suits[3]  = "что хочу,  то и ворочу";

Предотвратить подобное развитие событий поможет объект неизменяемой оболочки:

 

private final   string suitNames[]  = { "черви",   "трефы",   "Бубны",   "пики"}

public final   List suits =

                                Collections.unmodifiableList(Arrays.asList(suitNames));

 

Массив suitNames с наименованиями карточных мастей объявлен как private и поэтому не может быть модифицирован напрямую. Доступ к нему обеспечен только при посредничестве public-списка suits, и любая попытка изменения содержимого писка с помощью соответствующих методов класса List приведет к выбрасыванию Исключения. (Как будет рассказано ниже, в разделе 16.9, метод asList класса Arrays создает список, в основе которого лежит массив).

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии