venerdì 24 settembre 2010

Una classe davvero utile: la classe Properties

Ho già utilizzato in passato questa classe per aggiugere propietà all'oggetto Session dell'API JavaMail e solo adesso mi rendo conto della sua molteplice utilità. In questo articolo vi spiego un utilizzo davvero interessante di questa classe!

La classe Properties, package java.util.Properties, è in grado di rappresentare un set di coppie chiave-valore in maniera persistente, salvandole e caricandole da uno stream. Le coppie di valori scritte e lette dal file vanno interpretate come stringhe, ogni eventuale valore numerico associato a una chiave va quindi ripristinato con un parsing.

Il costruttore della classe (Properties()) genera una lista vuota, da personalizzare quindi in seguito. Esiste poi un secondo costruttore che permette sia l'istanza dell'oggetto e sia l'inizializzazione dello stesso con una lista di proprietà (Properties(Properties defaults)).

Le coppie di valori possono essere assegnate con:

Object setProperty(String chiave, String valore)
che ritorna il precedente valore aggiunto alla lista, se presente, altrimenti null. La ricerca dei valori avviene invece con:
String getProperty(String chiave)
che cerca la chiave all'interno della lista restituendone il valore precedentemente assegnato (altrimenti null se la chiave non viene trovata). Direi che fin qui nulla di nuovo o di eclatante. All'inizio dell'articolo parlavo però di persistenza e in effetti la classe è in grado di garantirla! Attraverso due metodi possiamo scrivere su file e leggere da file le proprietà impostate in una precedente sessione dell'oggetto. Con il metodo:
void store(OutputStream out, String header) throws IOException
possiamo scrivere le coppie assegnate all'oggetto sullo stream out. Se header è diverso da null una nuova riga di commento verrà aggiunta in testa al file, per spiegare ad esempio l'utilità del file. La scrittura su file provoca la stampa all'interno dello stesso, subito sotto l'header, della data di creazione del file. Con il metodo:
void load(InputStream in) throws IOException

possiamo, invece, leggere la lista di valori dallo stream in. Attenzione, gli ultimi due metodi, poiché lavorano su stream, possono lanciare un IOException (che va in qualche modo gestita, oppure propagata).

L'utilità di questa classe è davvero interessante. Pensate, ad esempio, a tutte quelle volte che dovete salvare su file le opzioni che configurano la vostra applicazione. E di come intercettare queste opzioni, leggendole dal file, ne vogliamo parlare? Insomma, chi deve preoccuparsi di questo compito? Il programmatore, di sicuro. Ecco allora che Properties viene in nostro soccorso, usiamo questa classe per liberarci in modo elegante da un compito!

Dopo aver letto la documentazione sulla classe non ho perso tempo e ho subito scritto un package di supporto per la gestione della classe in questione. Ho dotato la classe del costruttore base, caratterizzando gli oggetti in base al nome del file da usare (più altri campi). I metodi per aggiungere e cercare coppie di valori sono stati sistemati all'interno di istruzioni di controllo per evitare l'assegnazione di valori già esistenti o nulli. Quindi ho aggiunto due metodi per leggere e salvare su file (load() e save()), inserendo i metodi della classe (load() e store()) all'interno di istruzioni utili alla gestione degli stream di input e di output. Ogni metodo (ad eccezione di quello assegnato alla lettura del valore di una chiave, che ritorna una stringa) ritona un valore logico che riflette l'esito dell'operazione. Ho poi dotato la classe di un buffer per gli errori, da consultare non appena un'operazione non va a buon fine. Trovate la classe da me scritta a questo indirizzo. All'interno della classe trovate un metodo main utile al testing della classe, ecco ad esempio cosa genera:

Nessun commento:

Posta un commento