net.ranides.assira.collection.list
Class ListBiAdapter<T,S>

java.lang.Object
  extended by java.util.AbstractCollection<E>
      extended by java.util.AbstractList<T>
          extended by net.ranides.assira.collection.list.ListAdapter<T,S>
              extended by net.ranides.assira.collection.list.ListBiAdapter<T,S>
Type Parameters:
T - format publiczny, udostępniany konsumentowi
S - 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 net.ranides.assira.collection.list.ListAdapter
apply, apply, get, inverse, size
 
Methods inherited from class java.util.AbstractList
add, addAll, clear, equals, hashCode, indexOf, iterator, lastIndexOf, listIterator, listIterator, subList
 
Methods inherited from class java.util.AbstractCollection
addAll, contains, containsAll, isEmpty, remove, removeAll, retainAll, toArray, toArray, toString
 
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface net.ranides.assira.generic.Function
apply
 
Methods inherited from interface net.ranides.assira.generic.CoFunction
inverse
 
Methods inherited from interface java.util.List
addAll, contains, containsAll, isEmpty, remove, removeAll, retainAll, toArray, toArray
 

Constructor Detail

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 -
Method Detail

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.