Laboratorio di reti I: Java Stefano Brocchi [email protected] 13 ottobre, 2009 Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 1 / 27 In queste slide Concetti di programmazione a oggetti Tipi, polimorfismo e casting Strutture dati e classi utili forniti da Java Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 2 / 27 Tipi, polimorfismo e casting Oggetti In Java tutto ciò che non sia un tipo di base (intero, booleano...) è un oggetto Il tipo di un oggetto è definito da una classe Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 3 / 27 Tipi, polimorfismo e casting Oggetti e ruoli Nel definire una classe, è utile cercare di definire un oggetto che sia indipendente dal contesto in cui viene utilizzato Assegnare ad ogni oggetto un ruolo ben preciso e limitare le operazioni svolte dall’oggetto ai compiti di cui è responsabile In questo modo è molto più facile controllare la correttezza delle operazioni svolte dall’oggetto Inoltre si garantisce cosı̀ la riusabilità del codice, una più semplice suddivisione del lavoro tra vari componenti di un gruppo ed una facile estendibilità del progetto Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 4 / 27 Tipi, polimorfismo e casting Campi privati, protetti e pubblici Un oggetto contiene un insieme di metodi rappresentanti ciò che l’oggetto può fare, e una serie di attributi (anche detti campi o proprietà) I campi possono essere Privati: l’accesso è consentito solo ai metodi della classe stessa Protetti: l’accesso è consentito ai metodi della classe e delle classi che lo estendono Pubblici: l’accesso può essere fatto liberamente I campi di un oggetto devono solitamente essere tutti privati in modo da avere un maggiore controllo sul loro accesso Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 5 / 27 Tipi, polimorfismo e casting Campi statici Un campo può essere inoltre dichiarato come statico In questo caso la variabile associata sarà globale e non collegata ad una singola istanza Sempre per ottenere un maggiore controllo sulla modifica di una variabile, è opportuno evitare di utilizzare campi statici Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 6 / 27 Tipi, polimorfismo e casting Estendibilità Per l’estendibilità, ogni classe deriva da un’altra Es. public class classeFiglia extends classePadre Gli oggetti della classe figlia saranno considerati come un caso particolare di quelli della classe padre La classe figlia dovrà avere tutte le funzionalità della classe padre, più eventualmente delle funzionalità aggiuntive Ogni contesto che richiede un oggetto della classe padre accetterà anche oggetti della classe figlia Tutti gli oggetti derivano da Object Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 7 / 27 Tipi, polimorfismo e casting Estendibilità e polimorfismo Vediamo come un oggetto possa essere sostituito ad un altro meno generico Consideriamo i metodi public void metodo1(Object o) public void metodo2(mioOggetto o) Il seguente codice è corretto... mioOggetto mo = new mioOggetto(); metodo1(mo); ...mentre il seguente da un errore in compilazione Object o = new Object(); metodo2(o); Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 8 / 27 Tipi, polimorfismo e casting Downcast Se si è sicuri che a run time un oggetto sia di un certo tipo, ma il nome della variabile che lo referenzia è di un sovrattipo, si può eseguire un downcast Object o = new mioOggetto(); // metodo2(o); // Errore di compilazione metodo2( (mioOggetto) o ); // Ok Se viene eseguito un downcast di un oggetto ad un tipo che non corrisponde con il suo, viene generata un’eccezione a runtime Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 9 / 27 Tipi, polimorfismo e casting Tipi di base Tipi di base In Java sono definiti dei tipi di base, come int, long, char, byte Questi non sono considerati oggetti, ma in alcuni casi può essere necessario considerarli come tali Esistono per questo delle classi equivalenti che fanno da contenitore per questi valori, come Integer Long Byte Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 10 / 27 Tipi, polimorfismo e casting Tipi di base Oggetti per tipi di base Si può creare uno di questi oggetti dal tipo corrispondente tramite il costruttore Es. Integer i = new Integer(3); Esistono poi i metodi per poter eseguire l’operazione inversa ed ottenere la variabile originale Es. int i2 = i.intValue(); Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 11 / 27 Tipi, polimorfismo e casting Tipi di base Conversioni fra tipi In queste classi sono presenti anche diversi metodi per la conversione tra tipi Il metodo parseInt di Integer per esempio effettua la conversione tramite parsing da una stringa a un intero int i = Integer.parseInt("3"); Similarmente si possono usare i metodi parseFloat di Float, parseByte di Byte... Il modo più semplice per convertire numeri a una stringa è invece tramite l’operatore di somma: int i = 3; String s = "" + i; Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 12 / 27 Strutture dati fornite con Java Risorse disponibili in Java In Java sono messe a disposizione numerose classi utili Solitamente quando si vuole utilizzare una struttura dati o un algoritmo molto noto, è opportuno aspettarsi che questo sia già implementato Ciò è reso possibile dalle qualità della programmazione a oggetti come la riusabilità del codice Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 13 / 27 Strutture dati fornite con Java Risorse disponibili in Java Alcune operazioni e strutture dati disponibili in Java sono: Vettori dinamici Liste Stack e code Tabelle hash Ricerca su stringhe Operazioni matematiche (trigonometria, logaritmi e potenze, arrotondamenti, generazione casuale...) Ricerca su stringhe Parsing di una stringa Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 14 / 27 Strutture dati fornite con Java Uso di classi preesistenti Per questo programmando in Java è importante saper sfruttare le risorse a disposizione Prima di implementare da zero una struttura dati controllare cosa c’è a disposizione Tenere sempre presente la documentazione Java http://java.sun.com/javase/6/docs/ http://java.sun.com/javase/6/docs/api/index.html Vedremo alcune delle classi per le strutture citate Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 15 / 27 Strutture dati fornite con Java Classe Vector Classe Vector La classe java.util.Vector rappresenta un vettore dinamico Come molte altre classi per strutture dati, predisposta per gestire oggetti di tipo Object In questo modo qualsiasi oggetto può essere inserito in un Vector Necessario riconvertire l’oggetto, al momento dell’estrazione, al tipo originale Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 16 / 27 Strutture dati fornite con Java Classe Vector Metodi di Vector Un oggetto Vector può essere creato tramite il costruttore vuoto Si può usare il metodo add per aggiungere un elemento in fondo al vettore, le cui dimensioni verranno incrementate automaticamente public boolean add(Object o) Metodi per l’impostazione, l’estrazione e la rimozione di un oggetto da una determinata posizione: public Object set(int index, Object o) public Object get(int index) public Object remove(int index) Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 17 / 27 Strutture dati fornite con Java Classe Vector Uso di Vector Vediamo un esempio di uso di Vector Vector v = new Vector(); int i = 5; v.add(new Integer(i)); Object o = v.get(0); Integer in = (Integer)o; int i2 = in.intValue(); v.add(new Integer(7)); int i3 = ((Integer)(v.get(1))).intValue(); Stefano Brocchi Laboratorio di reti I: Java // 5 // 7 13 ottobre, 2009 18 / 27 Strutture dati fornite con Java Classe Vector Uso di Vector Se si vogliono inserire degli elementi in un Vector non ordinatamente, si possono impostare le dimensioni tramite setSize(int newsize) Vector v = new Vector(); v.setSize(10); // Creati indici da 0 a 9 v.set(8, "test"); v.add("bla"); // Aggiunto indice 10 System.out.println(v.get(10)); // Output: bla Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 19 / 27 Strutture dati fornite con Java Classe Vector Altre funzionalità di Vector Numerosi altri metodi in Vector comprendono funzionalità per Gestione delle dimensioni di un vettore Ricerca di un elemento Aggiunta e rimozione di gruppi di elementi Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 20 / 27 Strutture dati fornite con Java Classe Stack Classe Stack La classe java.util.Stack rappresenta uno stack Metodi per l’inserimento e la rimozione di un elemento in cima alla pila: public Object push(Object o) public Object pop() Esistono inoltre metodi per il controllo delle dimensioni dello stack: public int size() public boolean isEmpty() Inoltre la classe Stack estende Vector, e quindi offre anche tutti i metodi di questa classe Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 21 / 27 Strutture dati fornite con Java Classe LinkedList Classe LinkedList La classe java.util.LinkedList rappresenta una lista Contiene metodi per l’inserimento e la rimozione di un oggetto in testa alla lista come addFirst(Object o), removeFirst() ... o per inserire e rimuovere dal fondo della lista addLast(Object o), removeLast() Possibile ottenere la dimensione della lista tramite size() Può essere facilmente utilizzata in funzione di pila o di coda A disposizione diverse altre funzionalità come l’inserimento o la rimozione in un determinato punto o la ricerca di un dato elemento Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 22 / 27 Strutture dati fornite con Java Classe Hashtable Classe Hashtable La classe java.util.Hashtable rappresenta una tabella hash La chiave della tabella è rappresentata dal codice hash di un oggetto passato I metodi per l’inserimento, l’estrazione e la rimozione sono public Object put(Object key, Object value) public Object get(Object key) public Object remove(Object key) Per ottenere il codice hash di un oggetto viene chiamato il metodo hashcode Il metodo è definito in Object ed è quindi presente in ogni oggetto Se ritenuto opportuno, il metodo può venir riscritto per ottenere codici hash migliori Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 23 / 27 Strutture dati fornite con Java Classe Hashtable Hashtable e vettori associativi La classe Hashtable può essere comoda anche per creare dei vettori associativi. Ad esempio: Hashtable passwords = new Hashtable(); passwords.put("marco", "lkjhgf"); passwords.put("luca", "qwerty"); System.out.println("Password di Luca: " + passwords.get("luca")); Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 24 / 27 Strutture dati fornite con Java Classe StringTokenizer Classe StringTokenizer Un’altra classe utile è java.util.StringTokenizer, che permette di spezzare una stringa in più parti a seconda di un dato delimitatore Un esempio: suddividere ”uno,due,tre” in ”uno”, ”due” e ”tre” Richiede come argomenti del costruttore la stringa da dividere ed i caratteri che fanno da delimitatori Il metodo nextToken() restituisce una parte della stringa e passa alla successiva Il metodo hasMoreElements() controlla se ci sono ancora elementi da scorrere Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 25 / 27 Strutture dati fornite con Java Classe StringTokenizer Uso di StringTokenizer Un esempio dell’uso di StringTokenizer: StringTokenizer st = new StringTokenizer( "Una_stringa_di_prova", "_"); while (st.hasMoreElements()) { System.out.print(st.nextToken() + " "); } // Output: Una stringa di prova Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 26 / 27 Strutture dati fornite con Java Alcune funzionalità della classe String Alcune funzionalità della classe String Per quanto riguarda la manipolazione delle stringhe, vari metodi utili si possono trovare nella classe String per vari utilizzi: Estrazione o ricerca di una sottostringa - substring, indexOf Corrispondenza con un’espressione regolare - matches Manipolazione maiuscole e minuscole - toUpperCase, toLowerCase, equalsIgnoreCase Rimpiazzamento di un carattere con un altro - replace, replaceAll Confronto alfabetico - compareTo, compareToIgnoreCase Stefano Brocchi Laboratorio di reti I: Java 13 ottobre, 2009 27 / 27