You are on page 1of 4

CLASSE ASTRATTA 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 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 crea una classe completamente astratta, che consente al programmatore di !. stabilire i nomi dei metodi, gli argomenti, i valori di ritorno" #. non inserire al suo interno il corpo di un metodo" $ealizzare un'interfaccia equivale a stabilire %a cosa dovranno somigliare tutte le classi che la 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 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.

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, come dischi, memoria,ecc. *li +tream supportano molti tipi di dato, dai b,te ai tipi primitivi, fino agli oggetti. -lcuni +tream 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 stream per leggere dati da una sorgente, un pezzo alla volta

Un programma utilizza un %output stream per scrivere dati su una destinazione, un pezzo alla volta

Byte Stream

+i utilizza un byte stream per realizzare input/output con b,te di 0 bit. 1utte le classi che operano sugli stream derivano da 2nput+tream e Output+tream. 3,te+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$ "ileOutputStream out # null$ try { in # new "ileInputStream(%!anadu&t!t%)$ out # new "ileOutputStream(%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 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(%!anadu&t!t%)$ outputStream # new "ile-riter(%characteroutput&t!t%)$ int c$ while ((c # inputStream&read()) '# ()) {

outputStream&write(c)$ * * +inally { i+ (inputStream '# null) { inputStream&close()$ * i+ (outputStream '# null) { outputStream&close()$ * * * *

da notare che in )op,)haracters cos, come in )op,3,tes si usa un int per scrivere e leggere su/da file. L'unica differenza che negli stream di b,te 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 b,te. 2 primi utilizzano questi ultimi ma operano una traduzione dei b,te in caratteri.

Buffered Stream

+e si utilizza un unbuffered 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. 2 bufferedInputStream leggono dati da un'area di memoria conosciuta come buffer 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 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 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, che per( ha la limitazione di avere dimensione fissa. 8ava offre un insieme di classi contenitore i cui tipi base sono List Set ueue !ap. 1ra le molteplici caratteristiche, degno di nota il fatto che gli oggetti di questo tipo si ridimensionano automaticamente, il che permette di inserire un numero arbitrario di oggetti senza dover specificare a7priori la 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 <tipoOggettiDaContenere> [ArrayList<String>] C%llecti%n& una raccolta sequenziale di singoli elementi,ai quali sono applicate una o pi regole rappresentanti la politica di gestione di questi. Collection<Integer> c = new ArrayList<Integer>(); !ap& un gruppo di coppie %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 array associati!o poich> associa oggetti ad altri oggetti.

Map<String String> !ap = new "as#Map<String String>(); Iterat%r un design pattern molto potente. ?iene utilizzato per scorrere un contenitore, di qualunque tipo esso sia. 9' importante nelle 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%&.

You might also like