Programmazione.it
Generici e Java 5, prima parte
Scritto da Davide Panceri il 29-10-2004 ore 02:14
In Java 1.4, le collection possono contenere oggetti di qualsiasi tipo, ma richiedono alcuni accorgimenti a volte noiosi; per esempio non si possono inserire variabili <em>int</em>, <em>float</em>, <em>double</em>, ma bisogna usare le corrispondenti classi wrapper, intuitivamente chiamate <em>Integer</em>, <em>Float</em>, <em>Double </em>e così via.
Quando poi si estraggono elementi da una collezione, non vengono restituiti <em>Short Integer</em> o <em>Byte</em> ma più genericamente oggetti, di cui deve essere fatto il cast nel tipo più utile in funzione delle circostanze.
L'uso dei generici, introdotti da Java 5, dovrebbe rendere la sintassi meno complicata e di conseguenza il codice più facile da leggere e mantenere. L'esempio, che oltre a non essere nuovo ha <a target="_blank" href="http://homepages.inf.ed.ac.uk/wadler/gj/Documents/gj-tutorial.pdf">antenati illustri</a>, arriva da un <a target="_blank" href="http://java.sun.com/developer/technicalArticles/J2SE/generics/">articolo tecnico</a> sul sito Sun dedicato specificatamente a questa innovazione del linguaggio, anche se il link precedente mostra quanto relativa sia la novità:

<em> LinkedList list = new LinkedList();
list.add(new Integer(1));
Integer num = (Integer) list.get(0);</em>

Nella terza riga è necessario effettuare il cast a <em>Integer</em> del valore ritornato dal metodo <em>list.get()</em>, cosa che la Tigre ci risparmia:

<em> LinkedList</em><em> list = new LinkedList</em><em>();
list.add(new Integer(1));
Integer num = list.get(0);</em>

dove il tipo LinkedList è parametrizzato a <em>Integer</em>, non serve più castare la variabile restituita dal metodo <em>get</em>.
Il codice può essere ulteriormente alleggerito grazie all'autoboxing:

<em> list.add(1);
int num = list.get(1);
</em>
Al di là di questi aspetti formali, l'uso del generico garantisce che nella lista si trovi, per tutta la durata del programma, uno ed un solo tipo di variabile, mentre l'operatore di casting dice una cosa valida in un certo punto del programma. Di conseguenza il programma risulta non solo più leggibile, ma anche più robusto.
Se si prova ad eseguire uno qualunque degli esempi proposti, il compilatore ci regala delle note, invitandoci ad usare <em>-Xlint:unchecked</em> per maggiori dettagli; le obiezioni del compilatore sull'applicazione della <em>add</em> alla lista, non sembrano impedire la corretta esecuzione del programma.
L'avvertimento a tempo di compilazione rende più solido il programma compilato, rispetto a quanto avveniva prima, con eventuali errori di runtime dovuti al type mismatch.
La questione dei generici porta ad una sottile (si fa per dire) <a target="_blank" href="http://it.slashdot.org/article.pl?sid=04/10/11/1454220&tid=108&tid=8">polemica</a> tra i sostenitori di Java e quelli di C#, i fedeli delle due chiese. Alla fine sembra vi sia comunque un accordo sulla sostanziale equivalenza tra i linguaggi, restano le frecciatine su chi sia arrivato prima al punto; insomma, restano decisive differenze ovvie ed importanti, tipo portabilità o facilità d'uso, ecc.
Copyright Programmazione.it® 1999-2005. Tutti i diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002.