CLASSE ASTRA AST RATTA TTA E INTERFACCIA Le interfacce e le classi astratte forniscono meccanismi mediante i quali separare l'interfaccia dall'implementazione. Queste due tipologie di classe vengono utilizzate, prettamente, per fornire una struttura di base alle classi derivate da esse. Ovviamente, queste non potranno essere utilizzate per creare un oggetto, ma rimarranno degli elementi astratti all'interno del programma. Una classe astratta è astratta è una classe con uno o più metodi astratti. Questa permette di creare in una classe, quindi, uno o più metodi indefiniti, allo scopo di mettere a disposizione una parte dell'interfaccia, senza la corrispondente implementazione, che viene poi fatta nelle classi derivate. Un'interfaccia Un'interfaccia crea crea una classe completamente astratta, che consente al programmatore di !. stabilire stabilire i nomi nomi dei dei metodi, metodi, gli gli argoment argomenti, i, i valori valori di ritorn ritorno" o" #. non inser inserire ire al al suo interno interno ilil corpo corpo di un un metodo metodo"" $ealizzare un'interfaccia equivale a stabilire %a cosa dovranno somigliare tutte le classi che la implementano&. implementano&. ertanto qualsiasi codice utilizzi un'interfaccia, sa quali metodi possono essere richiamati, ma nient'altro. Le differenze principali tra queste due tipologie di classe sono !. l'interfaccia permette il meccanismo dell'ereditarietà dell' ereditarietà multipla, multipla , creando una classe che pu( essere oggetto di upcasting a diversi tipi di base" #. l'interfaccia non pu( dichiarare membri e metodi concreti. )i( è possibile nelle classi astratte. astratte.
FILE Uno %stream I/O & rappresenta una sorgente di input o una destinazione di output. Questo pu( rappresentare una moltitudine di tipi di sorgenti e destinazioni, destinazioni, come dischi, memoria,ecc. memoria,ecc. *li +tream supportano molti tipi di dato, dai bte ai tipi primitivi, fino agli oggetti. -lcuni +tream semplicemente semplicemente trasmettono dei dati, altri invece trasformano i dati in un modo più congeniale all'ultilizzo che si deve fare. on è importante sapere come uno stream lavori internamente, ci( chè è importante è che lo stream è una sequenza di dati . Un programma utilizza un %input % input stream” per leggere dati da una sorgente, un pezzo alla volta
Un programma utilizza un %output % output stream” per scrivere dati su una destinazione, un pezzo alla volta
●
Byte Stream
+i utilizza un byte stream per realizzare input/output con bte di 0 bit. 1utte le classi che operano sugli stream derivano da 2nput+tream 2nput+tream e e Output+tream Output+tream.. 3te+tream dovrebbe essere evitato quando si ha a che fare con dei caratteri, in quanto il procedimento risulterebbe alquanto dispendioso 4vedi immagine5. 6ovrebbe essere invece preferito quando si ha a che fare con dell'input7output di basso livello.
public class CopyBytes { public static void main(String[] args) throws IO!ception { "ileInputStream in # null$ "ileOutputStrea m out # null$ try { in # new "ileInputStream (%!anadu&t!t%)$ out # new "ileOutputStre am(%outagain&t! t%)$ int c$ while ((c # in&read()) '# ) { out&write(c)$ *
* +inally { i+ (in '# null) { in&close()$ * i+ (out '# null) { out&close()$ * *
* *
●
Character Stream
La piattaforma 8ava memorizza i caratteri seguendo le %convenzioni Unicode” . *li stream di caratteri traducono automaticamente questo formato interno da/verso il set di caratteri locale. Questo meccanismo rende più facile la internazionalizzazione in quanto il programmatore non deve preoccuparsi del set di caratteri specifico di un luogo. 1utte le classi degli stream di caratteri discendono da Writer e e Reader . 9sempi di queste classi sono quelle che operano sui file, come FileReader e FileWriter: public class CopyCharacters { public static void main(String[] args) throws IO!ception { "ile,eader inputStream # null$ "ile-riter outputStream # null$ try { inputStream # new "ile,eader(%!ana du&t!t%)$ outputStream # new "ile-riter(%cha racteroutput&t!t %)$ int c$ while ((c # inputStream&re ad()) '# ) {
outputStream&write(c)$ * * +inally { i+ (inputStream '# null) { inputStream&close()$ * i+ (outputStream '# null) { outputStream&close()$ * *
* *
è da notare che in )op)haracters cos come in )op3tes si usa un int per scrivere e leggere su/da file. L'unica differenza è che negli stream di bte questo viene memorizzato negli ultimi 0 bit, negli stream di caratteri negli ultimi !: bit. +i pu( dire che gli stream di caratteri rappresentano dei %;rappers& per gli stream di bte. 2 primi utilizzano questi ultimi ma operano una traduzione dei bte in caratteri. ●
Buffered Stream
+e si utilizza un unbuffered I/O ogni I/O ogni chiamata di metodi ;rite e read viene gestita dal +istema Operativo. )i( pu( rendere meno efficiente un programma perchè richiede ripetuti accessi al disco, alla rete ecc. er ridurre questo tipo di carico, 8ava implementa i buffered I/O stream. stream. 2 bufferedInputStream leggono dati da un'area di memoria conosciuta come buffer ed ed il metodo nativo di lettura viene chiamato solo quando il buffer è vuoto. -nalogamente, bufferedOutputStream scrive dati su un buffer ed il suo metodo nativo di scrittura viene chiamato solo quando il buffer è pieno. inputStream # new Bu++ered,eader(new "ile,eader(%!anadu&t!t%))$ outputStream # new Bu++ered-riter(new "ile-riter(%characteroutput&t!t%))$
●
CONTENITORI
*eneralmente i programmi richiedono richiedono la creazione di numerosi oggetti i cui criteri saranno noti solo a tempo di esecuzione. )i( significa che non si conosceranno, a compile7time, ne il tipo ne la quantit< di tali oggetti. $agion per cui non si pu( fare affidamento a referenze di tipo nominativo 4named reference5 reference5 che si riferiscano a ognuno degli oggetti. 8ava offre offre diversi meccanismi per contenere i riferimenti agli oggetti. 2l primo %contenitore& che ci pu( venire in mente è l'array l' array , che per( ha la limitazione di avere dimensione fissa. 8ava offre un insieme di classi contenitore i contenitore i cui tipi base sono List Set ueue !ap. !ap. 1ra le molteplici caratteristiche, caratteristiche, degno di nota è il fatto che gli oggetti di questo tipo si ridimensionano ridimensionano automaticamente, automaticamente, il che permette di inserire un numero arbitrario di oggetti senza dover specificare a7priori la dimensione. dimensione. "enerici #type safe$ Un problema risolto in 8ava= è quello che prima si permetteva di inserire in una collezione anche tipi errati. )on i tipi generici ci( non è più possibile" il tipo degli oggetti viene dichiarato ●
tipoContenitore [ArrayList]
C%llecti%n& è una raccolta sequenziale di singoli elementi,ai quali sono applicate una o più regole C%llecti%n& rappresentanti rappresentanti la politica di gestione di questi. Collection c = new ArrayList();
!ap& è un gruppo di coppie %chiave7valore& !ap& %chiave7valore& indicanti gli oggetti, che permettono di recuperare un valore mediante la chiave ad esso associata. Una mappa permette di cercare un oggetto usando un altro oggetto è chiamato anche arrayassociati!o poich> associa oggetti ad altri oggetti.
Map !ap = new "as#Map();
Iterat%r è un design pattern molto potente. ?iene utilizzato per scorrere un contenitore, di qualunque tipo esso sia. 9' importante nelle situazioni situazioni in cui si è scritto del codice per un tipo di contenitore e poi ci si accorge che se ne vuole utilizzare un altro. Quindi permette di poter astrarre su ogni tipo di collection e ci( è molto potente. .ist /String0 s # new .ist/String0()$ Iterator/String0 iter # s&iterator()$
)on un iteratore non ci si deve preoccupare del numero di elementi presenti nell'arra. )i sono i metodi "as#e$t%& e ne$t%&. ne$t%&.