Generics & Collections Ingegneria del software Jody Marca jody.marca@polimi.it
I Generics 2 I Generics rendono possibile definire tipi parametrici tramite classi ed interfacce che gestiscono tipi generici Una classe generica è dichiarbile usando una variabile di tipo E. public class GenericTest<E> { private E var; public GenericTest(E var){ this.var = var;} public E getvar() { return var; } public void setvar(e var) { this.var = var;} }
I Generics - Esempio 3 Proviamo ad invocare la classe GenericTest public static void main(string[] args) { String st = (new GenericTest<String>("aaa")).getVar(); System.out.println(st+ " - "+st.getclass()); Integer it = (new GenericTest<Integer>(100)).getVar(); System.out.println(it+ " - "+it.getclass()); } Risultato esecuzione: aaa - class java.lang.string 100 - class java.lang.integer
Generics 4 Il tipo di dato che indicate va a sostituire la variabile di tipo utilizzata nella definizione dell interfaccia o della classe generica (ArrayList<String> o ArrayList<MiaClasse>) Non si possono utilizzare i tipi primitivi ma solo oggetti ArrayList<double> // Sbagliato ArrayList<Double> // Giusto
Java Collections Frameworks 5 Rappresenta un architettura unificata preposta all uso e al trattamento di gruppi di oggetti. Sono principalmente composte da: Interfacce: tipi di dati astratti che rappresentano collezioni, come List, Queue, Set e Map Implementazioni: classi basilari che implementano le interfacce fondamentali Algoritmi: implementazioni di funzioni basilari come ordinamento e ricerca, applicabili a tutte le collezioni
Collections - gerarchia 6
Collections Metodi dell interfaccia 7 // Operationi di base int size(); boolean isempty(); boolean contains(object element); boolean add(e element); // Opzionale boolean remove(object element); // Opzionale Iterator iterator(); // Operationi sull insieme boolean containsall(collection<?> c); boolean addall(collection<? extends E> c); // Opzionale boolean removeall(collection<?> c); // Opzionale boolean retainall(collection<?> c); // Opzionale void clear(); // Opzionale
Set 8 Set è una collezione che rappresenta un insieme di oggetti privo di elementi duplicati. Le tre principali implementazioni sono: HashSet TreeSet LinkedHashSet I set non mantengono alcun ordinamento, se questo fosse necessario si può utilizzare un SortedSet. L ordinamento può essere definito attraverso l uso di un Comparator
Liste 9 List è una collezione che rappresenta una sequenza di oggetti nella quale sono ammessi i duplicati. Le tre principali implementazioni sono: ArrayList LinkedList Vector Fornisce metodi aggiuntivi rispetto a Collection
Liste 2 10 // Accesso Posizionale E get(int index); E set(int index, E element); boolean add(e element); void add(int index, E element); E remove(int index); boolean addall(int index, Collection<? extends E> c); // Ricerca int indexof(object o); int lastindexof(object o); // Iterazione ListIterator<E> listiterator(); ListIterator<E> listiterator(int index);
Queue 11 Queue è una collezione di oggetti pensata per contenere gli elementi prima di processarli; l implementazione principale è LinkedList. Fornisce metodi aggiuntivi rispetto a Collection Operazione Throws exception Returns special value Insert add(e) offer(e) Remove remove() poll() Examine element() peek()
Map 12 Map è una collezione che permette di associare un valore ad una chiave. Non sono ammessi valori e chiavi duplicate. Sono ammessi valori nulli! Le tre principali implementazioni sono: HashMap TreeMap LinkedHashMap Fornisce metodi aggiuntivi rispetto a Collection
Map 2 13 // Operatori base V put(k key, V value); V get(object key); V remove(object key); boolean containskey(object key); boolean containsvalue(object value); int size(); boolean isempty(); // Collection Views Set<K> keyset(); Collection<V> values(); Set<Map.Entry<K,V>> entryset();
HashTable 14 Hashtable non è una collezione ma implementa l interfaccia Map La principale differenza tra la Hashtable e la Hashmap è che la Hashtable è sincronizzata e non ammette valori nulli. Hashtable<String, Integer> numbers = new Hashtable<String, Integer>();
Interface Iterator<E> 15 L oggetto iterator permette di scandire e rimuovere oggetti da collezioni. Fornisce i seguenti metodi: boolean hasnext() E next(); void remove(); Iterator<String> iteratore = listastringhe.iterator(); while(iteratore.hasnext()){ stringa = iteratore.next(); //Elemento successivo iteratore.remove(); //Rimuovi elemento corrente }
Osservazione su Generics e Collections 16 E possibile vincolare il tipo generico ad essere un sottotipo di un tipo dato public void metodo(collection<? extends MiaSuperClasse> padre) Il metodo mostrato può gestire una qualsiasi collezione i cui elementi estendono la classe MiaSuperClasse