Programmazione Java Avanzata
Concetti su Java
Ing. Giuseppe D'Aquì
Testi di Riferimento
Java ( R. Liguori, P. Liguori), O'Reilly – Hops Tecniche Nuove
(2008)
Java Virtual Machine
Il codice scritto in Java viene compilato in un formato molto
simile al codice macchina, chiamato bytecode
Il bytecode viene eseguito da una Java Virtual Machine, che lo
traduce just-in-time in codice macchina specifico
E' il fondamento del concetto di ”Write Once, Run Anywhere”
Tipi di Java
Java è un linguaggio che ha più ”facce”
Viene usato in ambito:
Desktop Application (Java Standard Edition)
Web Application (Java Enterprise Edition)
Mobile Application (Java Micro Edition e Android)
Il linguaggio è sempre lo stesso, cambiano i tipi di JVM utilizzate
e le librerie a disposizione
Ci soffermeremo su Java Enterprise Edition
JVM e altri linguaggi
JVM non supporta solo Java
In ambito enterprise è naturale avere un insieme di software
scritto negli anni, da persone diverse e con linguaggi diversi
Inoltre la sintassi di Java è carente su alcuni aspetti (ad
esempio, programmazione funzionale) e quindi si può
semplificare lo sviluppo utilizzando linguaggi differenti
Moltissimi linguaggi sono stati ”portati” su JVM, per permettere
l'integrazione con framework e librerie Java
JRuby (Ruby)
Jython (Python)
PHP/Java Bridge e Quercus (PHP)
JVM e altri linguaggi (2)
Alcuni linguaggi sono stati inventati come sostituti o ad
integrazione di Java
Groovy
Scala
Clojure
Spesso le funzionalità introdotte sono la tipizzazione dinamica,
programmazione funzionale, concorrenza
In Java si può accedere a funzionalità ”a basso livello” tramite il
framework JNI (Java Native Interface), con il quale si possono
chiamare funzioni scritte in C, C++ o Assembly
Java IDE
Dato che Java è ormai il linguaggio più popolare* nell'industria
del software, sono numerosi gli ambienti integrati di sviluppo
(IDE)
Eclipse (inizialmente IBM, ora Eclipse Foundation)
Netbeans (inizialmente Sun, ora Oracle)
IntelliJ IDEA
Jbuilder
* vedi TIOBE Index: [http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html]
Eclipse
E' il più usato in ambito Java
Ha un'architettura modulare
Supporta decine di linguaggi
Supporta praticamente tutte le librerie e framework java, dato
che i plugin specifici vengono sviluppati prima per Eclipse e poi
per gli altri IDE
Ha degli ottimi analizzatori di codice
Convenzioni
I nomi delle classi sono sostantivi che iniziano in maiuscolo
Se il nome è composto da più di un sostantivo, ognuno di questi
avrà l'iniziale maiuscola (convenzione CamelCase)
Es. class StudenteLavoratore{ ... }
I nomi dei metodi sono composti da un verbo, oppure un verbo
più sostantivo; la prima iniziale minuscola, le successive
maiuscole
Es. class Studente{ … }
Es. int getRicaviEsercizio()
I nomi delle variabili membro sono composti da sostantivi e
usano la stessa convenzione dei metodi
Convenzioni
Le costanti sono tutte in maiuscolo, con i sostantivi separati da
underscore
Le costanti di enumerazione sono trattate come le costanti
Es. enum TipoStudente{LAVORATORE, NON_LAVORATORE}
I nomi dei package sono tutti in minuscolo, con i sostantivi
separati da underscore
Es. public static int MAX_VOTO = 30
Es. package org.unirc.ing.programmazione_java_avanzata
Attenzione! Ogni azienda segue le sue convenzioni per i
package, chiedete prima
Javadoc
Javadoc è un generatore di documentazione per il codice
Usa dei commenti speciali chiamati ”javadoc comments”
Formato: inizia con ”/**”, termina con ”*/”
I commenti Javadoc vengono estratti in fase di compilazione e
permettono di generare documentazione senza scriverla a parte
Ad esempio Eclipse è in grado di restituire, con un popup, i
commenti Javadoc per le classi e i metodi che stiamo usando
Si possono commentare classi, metodi e variabili
Javadoc: Esempio
/**
* Descrizione breve
*
* Descrizione lunga, che può stare anche su
* più righe.
*
* @param
b Stringa che rappresenta la parola cercata
* @return Indice dell'array che contiene la parola cercata
*/
public int cercaStringa(String b) {
…
}
Classi Astratte
In Java le classi astratte si definiscono con la parola chiave
abstract
Se una classe è astratta, non è possibile istanziare oggetti di
quel tipo
Errore: ClasseAstratta obj = new ClasseAstratta();
Se la classe astratta fa parte di una libreria (non è stata scritta
da noi), è necessario trovare classi concrete che la estendano
Oppure estenderla noi
Interfacce
Le interfacce (interface) sono definizioni di insiemi di metodi
pubblici, senza implementazione
Simili alle classi astratte
Una interface è un ”contratto” esplicito nel codice
Ogni classe che implementa una interface deve possedere
alcune funzionalità pubbliche (metodi)
Se sappiamo che una classe implementa una certa interface,
sappiamo che ha certe funzionalità e non ci interessa sapere
come vengono eseguite
Questo è un concetto di Design By Contract fondamentale
quando più di una persona deve scrivere un software
Java Generics
Dalla versione 5.0 Java ha aggiunto tecniche per rendere
”generica” la gestione di strutture dati
Ovvero, è possibile implementare una struttura dati (Lista,
Array, ecc) in modo indipendente dal tipo che dovrà contenere
Per esempio è possibile avere una List che gestisca Studenti e
una List che gestisca Elettrodomestici, senza usare l'ereditarietà
Con ereditarietà:
public class ListStudente extends List{ … }
public class ListElettrodomestici extend List { … }
Con Generics:
public class List <E> { … }
Java Collections
Le Java Collections sono interfacce e classi standard che
permettono di gestire strutture dati, gruppi di oggetti
Rendono obsoleto l'uso del tipo array nativo (es. int[10])
Implementano tutte l'interfaccia Collection o una delle sottointerfacce List, Queue, Set, Map
Sono estendibili, ovvero possiamo creare tipi specializzati di
Collections (oppure possiamo usare librerie che li creano)
Hanno un supporto per i Java Generics
Es. Collection lista = new ArrayList<String>();
Eccezioni
Le eccezioni in java sono di due tipi:
Checked Exception
Unchecked Exception
Le Checked Exception sono ”controllate” in fase di compilazione
cioè possiamo sapere dalla definizione dei metodi se un certo
tipo di codice può lanciare una data eccezione
Esempio: tutte le eccezioni definite da noi o dai framework
Le Unchecked Exception invece sono lanciate per problemi a
run-time, che non potevano essere conosciuti in fase di
compilazione del codice
Esempio: ArrayIndexOutOfBoundsException,
NullPointerException
Eccezioni (2)
Le eccezioni possono essere gestite (con try/catch)
Esempio:
public void nostraFunzione(){
try{
obj.funzioneCheLanciaEccezione();
}catch(MyException e){ … }
}
Le eccezioni possono essere ”rilanciate” ad una funzione di
livello più alto:
public void nostraFunzione() throws MyException{
obj.funzioneCheLanciaEccezione();
}
Java Annotations
Dalla versione 5.0 Java ha introdotto dei meccanismi per
inserire metadati descrittivi nel codice stesso
Questi metadati (dati a proposito dei dati) possono essere usati
per rendere espliciti alcuni comportamenti
Siccome sono immersi nel codice, esistono analizzatori in grado
di adoperarli per semplificare il lavoro si sviluppo o potenziare il
Design By Contract
Es. @Override, @Deprecated
Molti framework definiscono annotation proprie
Java Reflection
La Java Reflection Api è un insieme di classi e funzionalità che
vengono usate per conoscere e manipolare gli oggetti e i metodi
attualmente in esecuzione
Per esempio è possibile aggiungere o eliminare metodi alle
classi a run-time
Es. obj.getClass()
Può essere usato per rendere il codice illeggibile (spaghetticoding)
Viene usato più proficuamente per realizzare funzioni di analisi
del codice, usate dagli IDE e dai framework