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