Upload
lamkiet
View
222
Download
1
Embed Size (px)
Citation preview
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Tecniche diProgrammazione in Java
Giovanni RimassaDII - Università di Parma
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Il linguaggio Java
• Descrizione del Linguaggio Java– Caratteristiche Generali.– OOP in Java.– Programmazione Concorrente.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Il linguaggio Java
• Tratti più avanzati di Java– Serialization.– Reflection.– RMI.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Il linguaggio Java• Tra le altre, Java ha tre caratteristiche:
– E` un linguaggio concorrente.– E` un linguaggio bytecoded.– Ha una vastissima libreria standard.
• Queste influenzano la programmazione:– In Java, usare i thread è una scelta naturale.– Serialization e Reflection nel linguaggio.– Java si propone come una piattaforma.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
C++ e Java
• Quando Java è nato, venne presentato come“un C++ più facile e sicuro”.
• Un programmatore C++ trova in Java unasintassi familiare.
? C++ e Java sono, in realtà molto diversi.– Alcuni problemi in C++ spariscono in Java.– Alcuni idiomi C++ sono sbagliati in Java.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
C++ vs. Java
• All’inizio, il principale passatempo dellanascente comunità Java era il C++ bashing.– Per fare proselitismo.– Per affermare l’identità del linguaggio nascente.
• Oggi, Java è molto maturato (così come isuoi utenti).– La comunità Java ha proprie tecniche ed idiomi.– Java è anche insegnato come primo linguaggio.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
C++ vs. Java
• Java sbaglia cose che il C++ ha fatto giuste10 anni prima (contenitori type unsafe).
• Java rimedia a grossolani difetti del C++(import Map vs. #include <map>).
• Java aggiunge diverse feature di nonimmediato utilizzo, ma che diventano moltoutili in applicazioni complesse.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
OOP in Java
• Java è strettamente mono-paradigma.– In Java si può programmare solo secondo
l’approccio orientato ad oggetti.– L’unico meccanismo di estensibilità è quello
del polimorfismo per inclusione.
• Java, naturalmente, ha sue peculiarità.– Garbage Collection per gestire la memoria.– Ereditarietà singola, ma subtyping multiplo.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Object Life Cycle in Java
• In Java tutti gli oggetti sono allocati sulloheap con new.– Di default, semantica di riferimento.– Passaggio di parametri solo per riferimento.– Shallow copy con il metodo clone().– Deep copy a carico del programmatore.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Object Life Cycle in Java
• Java ha il Garbage Collector, quindi non siavranno mai memory leak dovuti a mancatadeallocazione.– Perciò, Java non ha distruttori da chiamare
quando un oggetto non è più referenziato.– C’è un metodo finalize(), chiamato
quando il GC libera la memoria di un oggetto.– Ma il GC può anche non partire mai !!!
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Object Life Cycle in Java
• “Resource allocation is initialization” è unidioma centrale in C++, ma con Java nonfunziona.– Indispensabile per codice exception-safe in
C++, ma Java sistema le cose con finally.
• Il GC evita i memory leak, ma le altrerisorse (file, connessioni, handle vari) ?– Occorre un metodo destroy() esplicito.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Ereditarietà in Java
• Java ha due parole chiave per l’ereditarietà,che ne esprimono due aspetti.
• La keyword extends:– Sia subtyping che inheritance.– Supporta solo la derivazione singola.
• La keyword implements:– Solo subtyping (niente implementazione).– Supporta la derivazione multipla.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Ereditarietà in Java• In Java, si usa la keyword interface per
indicare una classe senza dati e con tutti imetodi pubblici ed astratti.
• La relazione extends lega o due classi odue interfacce.
• La relazione implements lega una classead una interfaccia (la classe implemental’interfaccia).
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Sintassi per l’ereditarietà in Java
Shape
Circle Triangle Square
Estensione singola public abstract class Shape { // …}
class Square extends Shape { // …}
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Sintassi per l’ereditarietà in Java
public interface Shape { // …}
class Square implements Shape{
// …}
«interface»Shape
Circle Triangle Square
Implementazione singola
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Sintassi per l’ereditarietà in Java
public abstract class Shape { // ...}
public interface Persistent { // ...}
class Square extends Shape implements Persistent { // ...}
Derivazione multipla
Shape
Circle Triangle Square
«interface»Persistent
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Inner Class in Java
• Una Inner Class è semplicemente unaclasse definita all’interno di un’altra.– In C++ si chiamano nested classes.– Può essere un meccanismo di information
hiding.
• Tuttavia, le Inner Class di Java sono di più:– La relazione fra classi ne induce una tra oggetti.– Quelle anonime sono usate come code block.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Inner Class in Java
• Ogni oggetto di una inner class mantiene unriferimento ad un oggetto della sua classeesterna.
• All’atto della creazione, i casi sono due:– Se this è della classe esterna, viene usato
implicitamente.– Altrimenti, il programmatore deve fornirne uno.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Inner Class in Java• In un oggetto di classeInner, l’oggettoesterno è chiamatoOuter.this.
• In createInner(),viene usato this.
• Altrimenti, si usa lasintassi o.new.
public class Outer { public class Inner { public Outer getOuter() { return Outer.this; } } // End of Inner public createInner() { return new Inner(); }} // End of Outer
Outer o = new Outer();Outer.Inner i1 = o.createInner()Outer.Inner 12 = o.new Inner();
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Inner Class in Java• Dichiarando una inner class come static,
si elimina il riferimento all’oggetto esterno.• L’uso più interessante delle inner class si ha
con le Anonymous Inner Classes.– Alta information hiding.– Comodità di programmazione.– Flessibilità tramite reificazione.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Inner Class in Java• Nei linguaggi OO,
quando un concetto èmodellato come unaclasse, si manipola piùflessibilmente.
• La tecnica chiamatareificazione trasformale relazioni in classi.– Quando fermarsi ?
src:Host dest:Hostsends messages
src:Host dest:Host
puts messages
link:Channel
gets messages
src:Host dest:Host
puts messages
link:Channel
gets messages
srcEnd:EndPoint destEnd:EndPoint
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Inner Class in Java
• In Java, applicare la reificazione costringe acreare piccole classi, tipicamente usate unasola volta.– I gestori di eventi nelle GUI.– La rappresentazione di comandi ad un server.
• Da un design OO, risulta spesso utileintrodurre un’interfaccia o una classe baseastratta comune.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Inner Class in Java• Unendo un design che
usa un’interfacciaastratta all’uso di innerclass:– Estendibilità a runtime
con il polimorfismo.– Forte information
hiding con inner classprivata.
public interface Channel { // ...}
public class ChannelProvider() { private class SocketChannel
implements Channel { // ... }
public Channel getChannel() { return new SocketChannel(); } }} // End of CommManager
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Inner Class in Java• Se c’è un unico punto
in cui si usa la classeSocketChannel,non serve darle unnome.– Con una inner class
anonima si definisceuna sottoclasse diChannel all’atto dellacreazione dell’oggetto.
public interface Channel { // ...}
public class ChannelProvider() {
public Channel getChannel() { return new Channel(){ // In-line implementation }; } }} // End of CommManager
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Concorrenza in Java
• Java è il primo linguaggio ad oggetti di usocomune che abbia un supporto nativo per laconcorrenza.
• Java è multithreaded, dotato di monitor siaa livello di oggetto che di classe.– Classi Thread e ThreadGroup.– Keyword synchronized.– Metodi wait() e notify() di Object.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Concorrenza in Java• La classe Thread rappresenta un flusso di
esecuzione concorrente.– Un oggetto Java di classe Thread ha dentro un
thread del Sistema Operativo sottostante.– Il metodo Thread.start() attiva il thread
interno.– La funzione main del thread interno è il metodoThread.run().
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Concorrenza in Java
• Un oggetto con dentro un thread si chiamaOggetto Attivo.
• Ci sono due modi per realizzare un oggettoattivo in Java.– Estendere la classe Thread e ridefinire il
metodo run().– Implementare l’interfaccia Runnable, che
dichiara il metodo run().
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Concorrenza in Java
• Si vuole fare una classe Agent, che deve essereun oggetto attivo.– A sinistra, la soluzione con extends Thread.– A destra, la soluzione con implements Runnable.
+ void run()
Thread
+ void run()
Agent
11
1
1
+ void run()
«interface»Runnable
+ void run()
Agent
Thread
+ void run()
myThread
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Concorrenza in Java
• Due design a confronto:– Dal punto di vista modellistico, un agente
contiene un thread, ma non non è un thread.– L’ereditarietà è una relazione forgiata a compile
time; la delegation è più flessibile.– L’interfaccia Runnable disaccoppia Agent eThread.
? Meglio usare implements Runnable.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Concorrenza in Java
• Dove ci sono thread, ci devono esseremeccanismi di sincronizzazione.– In una visione process oriented, vi sono entità
attive (thread) che competono per l’accesso aentità passive (risorse).
– In Java, una risorsa è sempre incapsulata da unoggetto.
? In Java, ci si sincronizza su oggetti.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Concorrenza in Java• In Java, ogni oggetto di classe Object (e
quindi di qualunque altra classe) ha unmutex.– La parola chiave synchronized introduce
un blocco eseguito con il possesso del mutexassociato all’oggetto Java specificato.
• La classe Object non è astratta, e spessosi usano le sue istanze come lock.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Concorrenza in Java• Spesso, un oggetto
Java agisce esso stessosia come risorsa checome mutex.– Il costruttosynchronized(this)è molto comune.
– Si può semplificaredichiarando un metodocome synchronized.
class X { public void f() { // Do something synchronized(lock) { // lock held during this block } // lock released
}
public synchronized void g() { // synchronized(this) { // ‘this’ lock held in method // } }
}
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Concorrenza in Java
• La mutua esclusione, da sola, non èsufficiente.
• In Java, ogni oggetto non ha un semplicemutex, ma un monitor completo.
• Un monitor consente di mettersi in attesaall’interno della sezione di mutuaesclusione, dando accesso ad altri thread.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Concorrenza in Java• La classe Object espone i tre metodi:
– public final void wait() throws InterruptedException– public final void notify()– public final void notifyAll()
• wait() libera il mutex e blocca il thread.• notify() risveglia un thread bloccato.• notifyAll() risveglia tutti i thread
bloccati.– Tutti e tre richiedono il possesso del mutex.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Concorrenza in Java
• Contatore up/down.– inc() aspetta quando è al massimo e
notifica quando si lascia il minimo.– dec() aspetta quando è al minimo e
notifica quando si lascia il massimo.
? State-based synchronization.
class BoundedCounter { private long count = MIN; public synchronized void inc() { while(count == MAX) try { wait(); } catch(IE ie){ } if(count++ == MIN) notifyAll(); }
public synchronized void dec() { while(count == MIN) try { wait(); } catch(IE ie){ } if(count-- == MAX) notifyAll(); }}
Min Middle Max
dec() from Maxdec() to Min
inc() from Min inc() to Max
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Tratti Avanzati di Java
• Java è un linguaggio bytecoded.– Il compilatore javac genera del codice
macchina per un processore che non esiste.– L’interprete java esegue le istruzioni,
convertendole in codice della CPU reale.
• Il formato binario del bytecode Java (file.class) è organizzato a tabelle ed è moltoricco di meta-informazioni.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Java per Sistemi Distribuiti
• Creare sistemi distribuiti è difficile.– Spazi di indirizzamento separati.– Forte concorrenza.
• Alcune caratteristiche di Java sono assaiutili per fare sistemi distribuiti flessibili.– Serialization.– Reflection.– RMI.
UNIVERSITÀ DEGLI STUDI DI PARMADipartimento di Ingegneria dell’Informazione ENGINEERING
G. Rimassa - Progettazione e Programmazione Orientata agli Oggetti
COMPUTER
Serialization in Java
? In un sistema OO, lo sviluppatore definiscemolti tipi e ne collega le istanze conriferimenti.
? I meccanismi di IPC dei sistemi operativioperano su tipi di dati grezzi.