net.ranides.assira.collection.list
Class ListBiAdapter<T,S>
java.lang.Object
java.util.AbstractCollection<E>
java.util.AbstractList<T>
net.ranides.assira.collection.list.ListAdapter<T,S>
net.ranides.assira.collection.list.ListBiAdapter<T,S>
- Type Parameters:
T - format publiczny, udostępniany konsumentowiS - wewnętrzny format danych
- All Implemented Interfaces:
- Iterable<T>, Collection<T>, List<T>, BiFunction<T,S>, CoFunction<T,S>, Function<T,S>
- Direct Known Subclasses:
- ListBiAdapterTT
public abstract class ListBiAdapter<T,S>
- extends ListAdapter<T,S>
- implements BiFunction<T,S>
Klasa abstrakcyjna umożliwiająca leniwą konwersję listy elementów między dwoma
formatami w obie strony (a więc tworzenie list do odczytu i zapisu).
Ogólny wariant adaptera zakłada, że konwersja może zwracać jako wynik obiekty
innej klasy, niż źródłowa. Specjalizacja ListBiAdapterTT służy do przeprowadzania
konwersji, które mają wpływ jedynie na wartości, ale nie na klasy elementów.
Rozwiązuje problem synchronizacji między dwoma listami, które reprezentują ten
sam zbiór, ale w innym formacie: modyfikacja jednej natychmiast aktualizuje
drugą - nie musimy pamiętać o kontroli spójności oraz wstawianiu do obu list
wartości w odpowiednich formatach. Scenariusze w których ListAdapter dobrze
się sprawdza:
// spójna obsługa dwóch list
List<INTERN> source = ...
List<PUBLIC> target = konwersja
...
operacje get(PUBLIC & INTERN) + set(PUBLIC & INTERN)
// mieszana obsługa dwóch list
List<INTERN> source = ...
List<PUBLIC> target = konwersja
...
bardzo dużo operacji na get(PUBLIC) + set(PUBLIC & INTERN)
// obsługa dwóch list niszcząca spójność danych (A)
List<INTERN> source = ...
List<PUBLIC> target = konwersja
...
bardzo dużo operacji na get(PUBLIC & INTERN) + set(PUBLIC)
// obsługa dwóch list niszcząca aktualność danych (B)
List<INTERN> source = ...
List<PUBLIC> target = konwersja
...
bardzo dużo operacji na get(PUBLIC & INTERN) + set(INTERN)
// obsługa dwóch list niszcząca aktualność danych (C)
List<INTERN> source = ...
List<PUBLIC> target = konwersja
...
bardzo dużo operacji na get(PUBLIC & INTERN) + set(INTERN) + set(PUBLIC)
Wada: konwersja odbywa się przy każdym odczycie i zapisie, jeśli lista
adaptująca jest bardzo intensywnie używana klasyczne rozwiązanie będzie znacznie
wydajniejsze (jakkolwiek lista źródłowa nie będzie na bieżąco odświeżana):
List<INTERN> source = ...
List<PUBLIC> target = konwersja
...
bardzo dużo operacji get(PUBLIC) + set(PUBLIC)
...
source = konwersja powrotna
"bardzo intensywne użycie" to (szacunkowo) ponad 1.5N odczytów oraz zapisów,
gdzie N to rozmiar całej listy. Przykładowo 2-3 krotne przeiterowanie po wszystkich elementach
oraz zwiększenie ich wartości będzie instensywnym użyciem.
W metodach apply oraz
inverse można nie tylko
konwertować wartości, ale również logować operacje odczytu i zapisu.
Z tego powodu adapter może być użyty z powodzeniem jako wydajna realizacja
obserwatora.
|
- Author:
- ranides
|
Constructor Summary |
ListBiAdapter(List<S> content)
Tworzy nowy adapter odwzorowujący podaną listę. |
ListBiAdapter(S[] content)
Tworzy nowy adapter odwzorowujący podaną tablicę. |
|
Method Summary |
void |
add(int index,
T element)
|
T |
remove(int index)
|
T |
set(int index,
T element)
|
| Methods inherited from class java.util.AbstractList |
add, addAll, clear, equals, hashCode, indexOf, iterator, lastIndexOf, listIterator, listIterator, subList |
| Methods inherited from interface net.ranides.assira.generic.Function |
apply |
ListBiAdapter
public ListBiAdapter(List<S> content)
- Tworzy nowy adapter odwzorowujący podaną listę.
- Parameters:
content -
ListBiAdapter
public ListBiAdapter(S[] content)
- Tworzy nowy adapter odwzorowujący podaną tablicę.
- Parameters:
content -
set
public T set(int index,
T element)
- Specified by:
set in interface List<T>- Overrides:
set in class AbstractList<T>
add
public void add(int index,
T element)
- Specified by:
add in interface List<T>- Overrides:
add in class AbstractList<T>
remove
public T remove(int index)
- Specified by:
remove in interface List<T>- Overrides:
remove in class AbstractList<T>
Copyright © 2013. All Rights Reserved.