Jody Marca – jody.marca@polimi.it
Laboratorio N° 2
Cosa faremo oggi
Javadocs
Uso del debugger Input Output
Serializzazione degli oggetti
© 2015 – Jody Marca – Laboratorio numero 2
Javadoc
Javadoc è uno strumento che permette di documentare i un programma all’interno dei sorgenti stessi.
Anziché scrivere la documentazione di un programma in un file separato, il programmatore inserisce nel codice sorgente dei commenti particolari tags. Tali commenti vengono estratti dal programma javadoc che li converte in un formato più semplice per la consultazione
In generale un commento Javadoc è un testo HTML racchiuso tra i tag /** e */
Javadoc – tags principali
Può contenere tag HTML per aiutare la formattazione
<p>, e la presentazione come <b>, <i>, ecc
Tag Descrizione
@author Nome dello sviluppatore.
@deprecated Indica che l'elemento potrà essere eliminato da una versione successiva del software.
@link Crea un collegamento ipertestuale alla documentazione locale o a risorse esterna
@param Definisce i parametri di un metodo. Richiesto per ogni parametro.
@return Indica i valori di ritorno di un metodo.
@see Indica un'associazione a un altro metodo o classe.
@since Indica quando un metodo è stato aggiunto a una classe.
@throws Indica eccezioni lanciate da un metodo.
@version Indica il numero di versione di una classe o un metodo.
© 2015 – Jody Marca – Laboratorio numero 2
Debugger
Un debugger è un insieme di strumenti che ci permette di localizzare, isolare e quindi risolvere i bug presenti in un software. Ci permette di esaminare il programma
riga per riga in modalità di interruzione dell’esecuzione e di guardare i contenuti delle variabili
Per definire il punto di interruzione dobbiamo inserire dei Breakpoint
Debugger / 2
Proviamo a debuggare l’esercizio realizzato durante il primo laboratorio.
Individuiamo il problema Definiamo dei Breakpoint
Seguiamo il flusso di esecuzione Risolviamo il problema
© 2015 – Jody Marca – Laboratorio numero 2
Input Output
In Java la gestione dell’input-output è basata su stream Tutte gli stream sono figli di InputStream o OutputStream
Gli InputStream sono utilizzati per leggere da una sorgente di dati Gli OutputStream sono utilizzati per scrivere i dati
© 2015 – Jody Marca – Laboratorio numero 2
Leggere e scrivere un file
L’interazione con i file in Java deve seguire il seguente flusso:
Inizializzazione dello stream di lettura/scrittura Lettura/scrittura dei dati
Chiusura dello stream di lettura/scrittura
Possiamo suddividere i files in due categorie:
File di testo File binari
© 2015 – Jody Marca – Laboratorio numero 2
File di testo
Possiamo scrivere e leggere un file di testo convertendo i caratteri in bytes e vice versa
File byteFile = new File(NOME_FILE);
String stringa = "Ciao";
FileOutputStream fileOut = new FileOutputStream(byteFile);
fileOut.write(stringa.getBytes()); //Scrittura su file fileOut.close();
byte[] byteArray = new byte[1024];
FileInputStream fileIn = new FileInputStream(byteFile);
int len = fileIn.read(byteArray); //Lettura da file fileIn.close();
stringa = new String(byteArray, 0, len);
© 2015 – Jody Marca – Laboratorio numero 2
File di testo / 2
Possiamo inoltre scrivere e leggere un file di testo utilizzando direttamente delle stringhe di testo
File textFile = new File(NOME_FILE);
FileWriter outStr = new FileWriter(textFile);
PrintWriter writer = new PrintWriter(outStr);
writer.write("Ciao"); //Scrittura su file writer.close();
FileReader inStr = new FileReader(textFile);
BufferedReader reader = new BufferedReader(inStr);
String stringaFile = reader.readLine(); //Lettura da file reader.close();
inStr.close();
© 2015 – Jody Marca – Laboratorio numero 2
File binari
Su un file binario possiamo leggere e scrivere tipi primitivi.
File binFile = new File(NOME_FILE);
String stringa = "Ciao"; int intero = 5; //Tipi che andrò a scrivere e leggere FileOutputStream fileOutStr = new FileOutputStream(binFile);
DataOutputStream dataOut = new DataOutputStream(fileOutStr);
dataOut.writeUTF(stringa); //Scrittura su file dataOut.writeInt(intero); //Scrittura su file dataOut.close();
fileOutStr.close();
FileInputStream fileInStr = new FileInputStream(binFile);
DataInputStream dataIn = new DataInputStream(fileInStr);
stringa = dataIn.readUTF(); //Lettura da file intero = dataIn.readInt(); //Lettura da file dataIn.close();
fileInStr.close();
Serializzazione
La serializzazione è il processo che mi permette di
tradurre un’istanza di una classe in uno stream di byte che posso trasferire su un file o su un canale di
comunicazione
La deserializzazione è il processo inverso che mi permette di ricostruire la mia istanza della classe da uno stream di byte mantenendo lo stato che aveva prima della
serializzazione
© 2015 – Jody Marca – Laboratorio numero 2
Serializzazione /2
Per essere serializzabile una classe deve:
implementare l’interfaccia Serializable essere dichiarata come pubblica
avere tutte le variabili serializzabili
import java.io.Serializable;
public class Oggetto implements Serializable {
//Identificativo univoco della versione della classe serializzabile private static final long serialVersionUID = 1L;
private String stringa = null;
private Integer intero = null;
//Costruttore e metodi setter e getter omessi }
Stream di serializzazione
Per serializzare un oggetto si usa ObjectOutputStream
Oggetto oggetto = new Oggetto();
File objFile = new File(NOME_FILE);
FileOutputStream fileOut = new FileOutputStream(objFile);
ObjectOutputStream objOut = new ObjectOutputStream(fileOut);
objOut.writeObject(oggetto);
objOut.close();
fileOut.close();
© 2015 – Jody Marca – Laboratorio numero 2
Stream di deserializzazione
Per deserializzare un oggetto si usa ObjectInputStream
Oggetto oggetto = null;
File objFile = new File(NOME_FILE);
FileInputStream fileIn = new FileInputStream(objFile);
ObjectInputStream objIn = new ObjectInputStream(fileIn);
oggetto = (Oggetto) objIn.readObject();
objIn.close();
fileIn.close();
Serializzazione – variabili transient e static
Posso definire delle variabili che non voglio che vengano serializzate dichiarandole transient
ES: private transient Integer variabile = null;
Le variabili dichiarate static non vengono serializzate quindi se modifico una variabile dichiarata static, serializzo e deserializzo perdo la modifica
ES: private static Integer variabile = 5;
Evitate i side-effects dichiarando quando possibile le
variabili static come final in modo che il loro valore non possa essere modificato durante l’esecuzione
ES: private static final Integer variabile = 5;
© 2015 – Jody Marca – Laboratorio numero 2
Esercizio
Progettare un insieme di classi (utilizzando l’ereditarietà) che rappresentano degli articoli venduti in un
supermercato
Implementare le classi e un semplice programma con
interfaccia da console che ci permette di gestire i prodotti del supermercato calcolando le spese d’acquisto e i ricavi
Implementare dei metodi che possano leggere e scrivere su file in modo da rendere persistente lo stato del
magazzino