Zpo-2-wyk-Slajd27

Z Studia Informatyczne
Wersja z dnia 06:31, 21 sie 2006 autorstwa Bwalter (dyskusja | edycje)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacjiPrzejdź do wyszukiwania

Niezmienność kolekcji

Niezmienność kolekcji


Jednym z ciekawszych rozwiązań zastosowanych w klasie Collections jest możliwość uczynienia kolekcji niemodyfikowalną. Typowe rozwiązanie polega na stworzeniu dedykowanej podklasy, która posiada zmodyfikowane właściwości. Jednak w praktyce jest to rozwiązanie nieakceptowalne: powoduje podwojenie liczby klas, w zasadzie nie wprowadzając istotnych różnic. Ponadto, często zachodzi konieczność uniemożliwienia modyfikacji w czasie, gdy kolekcja już istnieje. Zmiana klasy istniejącego obiektu jest jednak niemożliwa.

Dlatego w bibliotece Java Collections zastosowano wzorzec projektowy Decorator: opakowanie istniejącego obiektu specjalnym obiektem tego samego typu, który zmieni zachowanie wybranych metod. W tym przypadku będzie to zablokowanie wszystkich metod, które mogą modyfikować kolekcję. Pozostałe metody są bezpośrednio delegowane do opakowanej kolekcji. Z punktu widzenia klienta zmiana nie jest widoczna: zarówno oryginalna kolekcja, jak i opakowanie są tego samego typu, inna jest tylko referencja do tego obiektu. Opakowanie, naturalnie, nie przechowuje kopii elementów kolekcji, a jedynie odwołuje się do jej metod. Zastosowanie obiektów opakowujących ma też tę zaletę, że można jednocześnie użyć kilku kolejnych opakowań jednocześnie.

Warto zwrócić uwagę na sposób realizacji opakowania: metody opakowujące w klasie Collections przyjmują, jako argument, kolekcję (listę, zbiór, mapę), a zwracają taką samą kolekcję, ale w postaci opakowanej. Dzięki temu wywołanie metody pozornie zmienia klasę, do której należy przekazany obiekt.


<< Poprzedni slajd | Spis treści | Następny slajd >>