Programmazione Java Avanzata Concetti su Java

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