<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alessandro Stella - Appunti di informatica &#187; Java</title>
	<atom:link href="http://www.alessandrostella.it/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alessandrostella.it</link>
	<description>Appunti sparsi di informatica</description>
	<lastBuildDate>Thu, 09 Sep 2010 15:20:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>JasperReport, iReport e java</title>
		<link>http://www.alessandrostella.it/java/2010/07/jasper-report-ireport-java/</link>
		<comments>http://www.alessandrostella.it/java/2010/07/jasper-report-ireport-java/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 16:10:06 +0000</pubDate>
		<dc:creator>Alessandro</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[iReport]]></category>
		<category><![CDATA[jasperReport]]></category>

		<guid isPermaLink="false">http://www.alessandrostella.it/?p=1169</guid>
		<description><![CDATA[Dobbiamo produrre delle stampe in pdf da java? Le soluzioni sono tante. Noi oggi ne tratteremo una in particolare: jasperReport! Non è semplicissimo, ma cercheremo di seguire tutti i passi necessari per renderlo facile&#8230; Ecco cosa faremo: 1. produzione file jrxml e compilazione del file jrxml in jasper 2. uso del file jasper in java [...]]]></description>
			<content:encoded><![CDATA[<p>Dobbiamo produrre delle stampe in pdf da java?<br />
Le soluzioni sono tante. Noi oggi ne tratteremo una in particolare: <strong><a href="http://jasperforge.org/projects/jasperreports" target="_blanck">jasperReport</a></strong>!<br />
Non è semplicissimo, ma cercheremo di seguire tutti i passi necessari per renderlo facile&#8230;<br />
Ecco cosa faremo:<br />
1. produzione file jrxml e compilazione del file jrxml in jasper<br />
2. uso del file jasper in java per produrre un file PDF<br />
<span id="more-1169"></span><br />
<strong>1. PRODUZIONE FILE JRXML E COMPILAZIONE IN FILE JASPER</strong><br />
Per eseguire i suoi compiti jasperReport usa file con estensione jrxml, ossia file xml nei quali scrive tutto quello che serve per produrre il report. Compilando il file jrxml si ottiene poi un file con estensione jasper.<br />
Da ciò deriva che la prima cosa da fare è produrre un file jrxml.<br />
Per farlo, scarichiamo un IDE creato appositamente: <strong><a href="http://jasperforge.org/projects/ireport" target="_blanck">iReport</a></strong>.<br />
Ora dobbiamo usare iReport per disegnare il nostro report.<br />
iReport si presenta più o meno come mostrato nella figura qui in basso e ci indica sin da subito la strada da seguire per creare un report:<br />
- creare una fonte dati<br />
- disegnare il report<br />
- visualizzare/salvare il report<br />
<a href="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReport_01.jpg" rel="lytebox"><img src="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReport_01-300x225.jpg" alt="iReport - Schermata di benvenuto" title="iReport - Schermata di benvenuto" width="300" height="225" class="aligncenter size-medium wp-image-1171" /></a><br />
Clicchiamo sul &#8220;passo 1&#8243;.<br />
Ci troveremo di fronte all&#8217;elenco di tutte le fonti dati da cui jasperReport può prelevare i dati da stampare (praticamente tutte). Noi qui prenderemo in esame quelle che più da vicino interessano un javista: Database JDBC connection, XML file datasource e JavaBeans.</p>
<p><u>Database JDBC connection</u><br />
Questa è l&#8217;opzione da scegliere se vogliamo che il nostro report prelevi i dati da stampare da un DB. Selezioniamo quindi questa voce e premiamo &#8220;Avanti >&#8221;. Qui di seguito possiamo osservare la schermata che ci viene proposta da iReport dopo la pressione del pulsante &#8220;Avanti>&#8221;.<br />
<a href="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReport_02.jpg" rel="lytebox"><img src="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReport_02-257x300.jpg" alt="iReport_02 - Database JDBC connection" title="iReport_02 - Database JDBC connection" width="257" height="300" class="aligncenter size-medium wp-image-1172" /></a><br />
Dobbiamo ovviamente avere le informazioni che servono per collegarci al DB (nella figura stiamo utilizzando una connessione JDBC a Oracle).<br />
ATTENZIONE: Se vogliamo usare <strong>Oracle</strong> dobbiamo scaricare la libreria ojdbc14.jar e posizionarla nella sottocartella &#8220;ide10\modules\ext&#8221; della cartella in cui abbiamo installato iReport.<br />
Una volta inseriti tutti i dati, scegliamo &#8220;Prova&#8221; per vedere se abbiamo fatto tutto bene e quando tutto è OK premiamo &#8220;Salva&#8221;.<br />
Ora, in alto al centro della schermata principale di iReport possiamo notare la nostra fonte dati.</p>
<p><u>XML file datasource</u><br />
Se la nostre fonte dati è un file XML, ci basta scegliere XML file datasource al &#8220;Passo 1&#8243; e premere &#8220;Avanti >&#8221;. Diamo poi un nome e scegliamo il file XML di riferimento.<br />
C&#8217;è però un caso in cui ci si può trovare in difficoltà nell&#8217;uso di un file XML come sorgente dati. E&#8217; il caso in cui si cerca di inserire in una <strong>jr:table</strong> i dati contenuti nel file xml. In tal caso dopo aver creato il dataset dal quale la tabella andrà a prendere i dati, è opportuno entrare nella visualizzazione XML e modificare la seguente stringa:</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dataSourceExpression<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource(1)]]&gt;</span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dataSourceExpression<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></td></tr></tbody></table></div>
<p>in quest&#8217;altra:</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dataSourceExpression<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[$P{REPORT_DATA_SOURCE}]]&gt;</span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dataSourceExpression<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></td></tr></tbody></table></div>
<p>Ok, facciamo un piccolo esempio <img src='http://www.alessandrostella.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Ammettiamo che questo sia il nostro file XML:</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;documento</span> <span style="color: #000066;">fase</span>=<span style="color: #ff0000;">&quot;Aggiudicazione&quot;</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #000066;">tipo</span>=<span style="color: #ff0000;">&quot;lavori&quot;</span> <span style="color: #000066;">settore</span>=<span style="color: #ff0000;">&quot;Ordinario&quot;</span></span><br />
<span style="color: #009900;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">numero</span>=<span style="color: #ff0000;">&quot;2341&quot;</span> <span style="color: #000066;">misto</span>=<span style="color: #ff0000;">&quot;Si&quot;</span></span><br />
<span style="color: #009900;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">oggetto</span>=<span style="color: #ff0000;">&quot;Inserire l'oggetto del contratto...&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;voce<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;testo<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/testo<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;valore<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/valore<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/voce<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;voce<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;testo<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Testo sulla prima colonna della tabella<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/testo<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;valore<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Testo sulla seconda colonna<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/valore<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/voce<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;voce<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;testo<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Testo 1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/testo<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;valore<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Testo 2<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/valore<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/voce<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;voce<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;testo<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Testo 3<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/testo<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;valore<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Testo 4<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/valore<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/voce<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/documento<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></td></tr></tbody></table></div>
<p>Ammettiamo inoltre di dover inserire i dati contenuti nel tag &#8220;testo&#8221; nella prima colonna della jr:table e i dati del tag &#8220;valore&#8221; nella seconda colonna.<br />
Trasciniamo quindi l&#8217;oggetto &#8220;Table&#8221; nella zona &#8220;Detail&#8221; del nostro report. Si presenterà la seguente schermata:<br />
<a href="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReportNewTable.jpg" rel="lytebox"><img src="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReportNewTable-450x325.jpg" alt="creazione nuova Table" title="creazione nuova Table" width="450" height="325" class="aligncenter size-medium wp-image-1225" /></a><br />
dalla quale dobbiamo associare la nostra tabella al dataset. Premiamo quindi &#8220;New dataset&#8221;. Nella schermata successiva diamo un nome al dataset (ad esempio SorgenteDatiXML) e scegliamo &#8220;Create new dataset&#8230;&#8221;. Premiamo &#8220;Avanti>&#8221;. Nella schermata successiva andiamo a cercare la sorgente dati che fa riferimento al file XML. Ora sempre &#8220;Avanti>&#8221; fino alla fine, quindi &#8220;Termina&#8221;.<br />
Ora nel &#8220;Report inspector&#8221;, sulla sinistra, sarà comparsa la voce &#8220;SorgenteDatiXML&#8221;.<br />
Clicchiamoci sopra con il tasto destro e scegliamo &#8220;Edit query&#8221;. Dalla schermata che si apre, nella combo &#8220;Query language&#8221; scegliamo &#8220;XPath&#8221; come nella figura qui sotto.<br />
<a href="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReportQueryLanguage.jpg" rel="lytebox"><img src="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReportQueryLanguage-450x355.jpg" alt="iReport - Query Language" title="iReport - Query Language" width="450" height="355" class="aligncenter size-medium wp-image-1227" /></a><br />
A questo punto tramite XPath andiamo a cercare i dati che ci interessano (documento/voce). Sulla destra apriamo il tag &#8220;voce&#8221; e trasciniamo i tag &#8220;testo&#8221; e &#8220;valore&#8221; nella parte bassa della figura. Premiamo &#8220;OK&#8221;.<br />
Ora, sotto &#8220;SorgenteDatiXML&#8221; troveremo i campi &#8220;testo&#8221; e &#8220;valore&#8221;.<br />
Portiamoci nell&#8217;edit della tabella e trasciniamo i campi nelle rispettive colonne, come nella sottostante figura.<br />
<a href="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReportEditTable.jpg" rel="lytebox"><img src="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReportEditTable-450x316.jpg" alt="iReport - Edit table" title="iReport - Edit table" width="450" height="316" class="aligncenter size-medium wp-image-1229" /></a><br />
Ora effettuiamo la sostituzione di cui si è parlato all&#8217;inizio di questo paragrafo (&#8220;dataSourceExpression&#8221;).</p>
<p><u>JavaBeans set datasource</u><br />
Questa è la scelta più complicata, ma forse più utile per un javista. In questo modo possiamo dire a jasperReport di prelevare le informazioni da stampare da un elenco (collezione o array) di beans! Procediamo.<br />
Dobbiamo innanzitutto sapere che<br />
<blockquote>&#8220;this datasource need a spacial factory class that provides a static method to generate a collection or an array of JavaBeans&#8221;</p></blockquote>
<p>ossia <strong>dobbiamo creare una classe che abbia un metodo statico e tale metodo DEVE restituire una collection o un array riempiti con i nostri beans</strong>.<br />
Qui di seguito vi porto un esempio di tale metodo (si presuppone l&#8217;esistenza di una classe di nome Bean che rappresenta il nostro bean):</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> java.<span style="color: #006633;">util</span>.<span style="color: #006633;">Collection</span><span style="color: #339933;">&lt;</span>Bean<span style="color: #339933;">&gt;</span> dammiLista<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; java.<span style="color: #006633;">util</span>.<span style="color: #006633;">Collection</span><span style="color: #339933;">&lt;</span>Bean<span style="color: #339933;">&gt;</span> persone <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ArrayList<span style="color: #339933;">&lt;</span>Bean<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span><span style="color: #cc66cc;">5</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Bean persona <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Bean<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; persona.<span style="color: #006633;">setCodiceFiscale</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;CODFISC&quot;</span><span style="color: #339933;">+</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; persona.<span style="color: #006633;">setCognome</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Cognome&quot;</span><span style="color: #339933;">+</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; persona.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Nome&quot;</span><span style="color: #339933;">+</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; persone.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>persona<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> persone<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Fatto questo, creiamo un .jar dal nostro progetto. Poi da iReport &#8220;Strumenti/Opzioni/Classpath&#8221;. Scegliamo &#8220;Add JAR&#8221; e aggiungiamo il nostro jar. Ora, aggiungendo un datasource di tipo &#8220;JavaBeans set datasource&#8221;, nel campo &#8220;Factory class&#8221; possiamo aggiungere la classe (completa di percorso del package in cui si trova). Nell&#8217;altro campo (il metodo statico) aggiungiamo il nome del metodo statico (nell&#8217;esempio &#8220;dammiLista) che ci restituisce la collection o l&#8217;array di beans, come mostrato nella figura qui sotto.<br />
<img src="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReport_03-386x450.jpg" alt="iReport - JavaBeans datasource" title="iReport - JavaBeans datasource" width="386" height="450" class="aligncenter size-medium wp-image-1194" /><br />
Premiamo il pulsate &#8220;Prova&#8221;. Deve venire fuori un &#8220;successo&#8221;, altrimenti abbiam sbagliato qualcosa&#8230; Se tutto è ok, clicchiamo sul destro sul nome del nostro progetto e scegliemo &#8220;Edit query&#8221;. Comparirà la schermata qui sotto<br />
<a href="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReport_04.jpg" rel="lytebox"><img src="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReport_04-450x337.jpg" alt="iReport - Recupero dati dalla collection" title="iReport - Recupero dati dalla collection" width="450" height="337" class="aligncenter size-medium wp-image-1210" /></a><br />
Dobbiamo quindi premere su &#8220;JavaBean Datasource&#8221; e inserire il nome della classe che rappresenta il singolo bean (nel nostro caso proprio Bean). Poi premiamo &#8220;Read attributes&#8221;. Al centro, come mostrato, comparirà l&#8217;elenco degli attributi del singolo Bean <img src='http://www.alessandrostella.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Selezioniamo quelli che ci interessano e premiamo &#8220;Aggiungi il campo(i) selezionati. Poi diamo &#8220;ok&#8221;.<br />
Adesso nei campi del nostro report sono comparsi quelli selezionati e, trascinandoli sul report possiamo stamparne i valori <img src='http://www.alessandrostella.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Bene.<br />
Qualunque sia stata la nostra scelta, ora prcediamo e creiamo il nostro report.<br />
Ritorniamo nella schermata principale e clicchiamo sul &#8220;Passo 2&#8243;.<br />
Ci verrà proposto un insieme di layout. Senza complicarci la vita dietro a layout più o meno belli e complicati, scegliamo il primo se vogliamo un report con stampa verticale o il secondo se preferiamo una stampa orizzontale. Clicchiamo quindi sul layout scelto e premiamo &#8220;Open this template&#8221;. Ora siamo pronti a disegnare il nostro report.<br />
Le guide sull&#8217;argomento non mancano, quindi vi rimando ad una qualunque di esse per prendere dimestichezza con iReport.</p>
<p><strong>2.USO DI JASPERREPORT IN JAVA</strong><br />
Usare jasperReport in java significa semplicemente aggiungere la sua jar (attualmente jasperreports-3.7.3.jar) nelle librerie del progetto. Fatto questo possiamo accedere alle sue classi.<br />
Se, ad esempio, il nostro file jasper compilato si chiama &#8220;ricevutaTrasfProgrTriennale.jasper&#8221; e deve <strong>recuperare i dati da un file XML</strong>, inviato tramite post in una web application, con il codice qui di seguito recuperiamo l&#8217;inputstream, modifichiamo il file XML (tramite jaxp) e richiamiamo jasperReport per la realizzazione del file PDF:</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> sendReportElencoReportXmlPdf<span style="color: #009900;">&#40;</span>HttpServletRequest request,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HttpServletResponse response<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003399;">ByteArrayOutputStream</span> out <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ByteArrayOutputStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003399;">String</span> pathFile <span style="color: #339933;">=</span> request.<span style="color: #006633;">getSession</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getServletContext</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getRealPath</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;WEB-INF/reports/ricevutaTrasfProgrTriennale.jasper&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003399;">String</span> pathFileImg <span style="color: #339933;">=</span> request.<span style="color: #006633;">getSession</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getServletContext</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getRealPath</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;WEB-INF/reports/LogoLomb.gif&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//String pathFile = request.getRealPath(&quot;&quot;) + &quot;WEB-INF/reports/ricevutaTrasfProgrTriennale.jasper&quot;;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.<span style="color: #006633;">debug</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;PATHFILE PDF: &quot;</span> <span style="color: #339933;">+</span> pathFile<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Map<span style="color: #339933;">&lt;</span>String , String<span style="color: #339933;">&gt;</span> lParameters <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HashMap<span style="color: #339933;">&lt;</span>String , String<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lParameters.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DATA_TIME&quot;</span>, <span style="color: #0000ff;">&quot;15/15/2015&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003399;">String</span> fileXML <span style="color: #339933;">=</span> request.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;file&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.<span style="color: #006633;">debug</span><span style="color: #009900;">&#40;</span>fileXML<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003399;">InputStream</span> in <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ByteArrayInputStream</span><span style="color: #009900;">&#40;</span>fileXML.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DocumentBuilderFactory f <span style="color: #339933;">=</span> DocumentBuilderFactory.<span style="color: #006633;">newInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DocumentBuilder db<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db <span style="color: #339933;">=</span> f.<span style="color: #006633;">newDocumentBuilder</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003399;">Document</span> doc <span style="color: #339933;">=</span> db.<span style="color: #006633;">parse</span><span style="color: #009900;">&#40;</span>in<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003399;">Element</span> root <span style="color: #339933;">=</span> doc.<span style="color: #006633;">getDocumentElement</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; root.<span style="color: #006633;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;img&quot;</span>, pathFileImg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; JRXmlDataSource xmlDS <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> JRXmlDataSource<span style="color: #009900;">&#40;</span>doc,<span style="color: #0000ff;">&quot;/trasferimenti/trasferimento&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//JRXmlDataSource xmlDS = new JRXmlDataSource(in,&quot;/trasferimenti/trasferimento&quot;);</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; in.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; JRPdfExporter exporter <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> JRPdfExporter<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; JasperPrint jasperPrint <span style="color: #339933;">=</span> JasperFillManager.<span style="color: #006633;">fillReport</span><span style="color: #009900;">&#40;</span>pathFile,lParameters, xmlDS<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exporter.<span style="color: #006633;">setParameter</span><span style="color: #009900;">&#40;</span>JRExporterParameter.<span style="color: #006633;">JASPER_PRINT</span>, jasperPrint<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exporter.<span style="color: #006633;">setParameter</span><span style="color: #009900;">&#40;</span>JRExporterParameter.<span style="color: #006633;">OUTPUT_STREAM</span>, out<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exporter.<span style="color: #006633;">exportReport</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>JRException e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.<span style="color: #006633;">error</span><span style="color: #009900;">&#40;</span>e, e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>ParserConfigurationException PCexc<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.<span style="color: #006633;">error</span><span style="color: #009900;">&#40;</span>PCexc, PCexc<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IOException</span> IOexc<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.<span style="color: #006633;">error</span><span style="color: #009900;">&#40;</span>IOexc, IOexc<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>SAXException SAXexc<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.<span style="color: #006633;">error</span><span style="color: #009900;">&#40;</span>SAXexc, SAXexc<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; response.<span style="color: #006633;">setContentType</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;application/vnd.pdf&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; response.<span style="color: #006633;">setHeader</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-Disposition&quot;</span>, <span style="color: #0000ff;">&quot;attachment; filename=stampaReport.pdf&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//response.setContentLength(out.size());</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ServletOutputStream output <span style="color: #339933;">=</span> response.<span style="color: #006633;">getOutputStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; out.<span style="color: #006633;">writeTo</span><span style="color: #009900;">&#40;</span>output<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; output.<span style="color: #006633;">flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Se invece i <strong>dati sono contenuti in una collezione di beans</strong>, ci tocca creare una classe che abbia un metodo statico che restituisca la collezione. Facendo riferimento al codice precedente e supponendo che la classe con il metodo statico si chiami <strong>PreparaStampa</strong>, dobbiamo modificare il datasource del precedente esempio come segue:</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">JRBeanCollectionDataSource javaBeansDS <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> JRBeanCollectionDataSource<span style="color: #009900;">&#40;</span>PreparaStampa.<span style="color: #006633;">dammiLista</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p><strong>CLASSICI PROBLEMI INCONTRATI DURANTE L&#8217;USO DI JASPERREPORT</strong><br />
Dopo aver creato il file jasper e aver provato a interagire con esso tramite codice java, può capitare di imbattersi nel seguente messaggio di errore:</p>
<blockquote><p>java.lang.NoClassDefFoundError: org/codehaus/groovy/control/CompilationFailedException</p></blockquote>
<p>In questo caso bisogna aprire il jrxml ed eliminare l&#8217;attributo <strong>language=&#8221;groovy&#8221;</strong> nel nodo <strong>jasperReport</strong>.</p>
<p>[... to be continued ...]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/java/2010/07/jasper-report-ireport-java/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>jQuery4j: gestire jQuery da java</title>
		<link>http://www.alessandrostella.it/java/2010/06/jquery4j-gestire-jquery-da-java/</link>
		<comments>http://www.alessandrostella.it/java/2010/06/jquery4j-gestire-jquery-da-java/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 09:50:38 +0000</pubDate>
		<dc:creator>Alessandro</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[zk]]></category>
		<category><![CDATA[zuml]]></category>

		<guid isPermaLink="false">http://www.alessandrostella.it/?p=1129</guid>
		<description><![CDATA[Questa è una buona notizia per i programmatori java Da qualche tempo è nato un ambizioso progetto: jQuery4j. Il nome dice già molto da solo: jQuery4j, ossia jQuery per java. Come si può intuire quindi, il progetto ha come scopo quello di consentire agli sviluppatori java di creare le proprie funzioni jQuery lato server, con [...]]]></description>
			<content:encoded><![CDATA[<p>Questa è una buona notizia per i programmatori java <img src='http://www.alessandrostella.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Da qualche tempo è nato un ambizioso progetto: <strong><a href="http://code.google.com/p/jquery4j/" target="_blanck">jQuery4j</a></strong>. Il nome dice già molto da solo: jQuery4j, ossia jQuery per java.<br />
Come si può intuire quindi, <strong>il progetto ha come scopo quello di consentire agli sviluppatori java di creare le proprie funzioni jQuery lato server, con creazione dinamica degli script lato client per l&#8217;interazione con i widgets jQuery</strong>! Non male!<br />
<span id="more-1129"></span><br />
Il progetto usa <a href="http://www.zkoss.org/" target="_blanck"><strong>ZK</strong></a> per velocizzare la creazione dell&#8217;interfaccia grafica basata su jQuery4j. ZK sembra essere il migliore gestore disponibile di Ajax + Mobile, progettato per massimizzare l&#8217;efficienza operativa dell&#8217;impresa e ridurre al minimo i tempi di sviluppo e i costi.<br />
ZK realizza i propri widget tramite jQuery, risulta pertanto facile integrarlo con altri plugin jQuery. Ha un parco di oltre 120 widgets pronti all&#8217;uso (calendario, tab, popup, ecc)! Spettacolo! Insomma RIA rapido e ottimizzato! A mio parere, però, c&#8217;è una pecca: ZK per creare i propri widget in modo rapido, usa un proprio linguaggio di programmazione, <a href="http://docs.zkoss.org/wiki/ZUML" target="_blanck">ZUML (Zk User interface Markup Language)</a>; per fortuna è basato su XML, ma resta il fatto che bisogna scrivere il codice secondo i suoi dettàmi, ossia legarsi a tale piattaforma&#8230; questo non va bene. Comunque sia, i vantaggi in termini di tempo e di risultati sono davvero straordinari!</p>
<p>Tornando a jQuery4j, vediamo ora di capire come possiamo usare tutta questa struttura per scrivere il codice, lato server, che si trasformerà poi in un calendario interattivo lato client.<br />
Per fare questo dobbiamo usare quella che i progettisti di jQuery4j chiamano <strong>richlet</strong>: <em>a richlet is a small Java program that creates all necessary components in response to user&#8217;s request. You can compose the UI by purely java, without html, ZUML. The programming logic is much like swing.</em></p>
<p>Ecco qui di seguito un richlet che realizza il nostro calendario:</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">org.zkoss.jquerydemo</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.zkoss.jquery4j.jqueryui.datepicker.Datepicker</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.zkoss.zk.ui.GenericRichlet</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.zkoss.zk.ui.Page</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> DatepickerRichlet <span style="color: #000000; font-weight: bold;">extends</span> GenericRichlet <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> service<span style="color: #009900;">&#40;</span>Page page<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Datepicker comp <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Datepicker<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; comp.<span style="color: #006633;">setChangeMonth</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; comp.<span style="color: #006633;">setPage</span><span style="color: #009900;">&#40;</span>page<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Bisogna ovviamente settare correttemente il proprio web.xml e zk.xml affinché queste richlet funzioni correttamente, ma per i dettagli vi rimando ai siti di riferimento sopra linkati.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/java/2010/06/jquery4j-gestire-jquery-da-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tomcat 7 è arrivato!</title>
		<link>http://www.alessandrostella.it/java/2010/06/tomcat-7-e-arrivato/</link>
		<comments>http://www.alessandrostella.it/java/2010/06/tomcat-7-e-arrivato/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 10:03:48 +0000</pubDate>
		<dc:creator>Alessandro</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://www.alessandrostella.it/?p=1136</guid>
		<description><![CDATA[Era davvero un po&#8217; di tempo che se ne parlava ed ora sembra proprio che ci siamo! Apache Tomcat 7 è finalmente sulla buona strada: l&#8217;ultima versione del popolare contenitore di servlet è arrivato alla fase finale dello sviluppo Ad oggi, sono state rese disponibili quattro client-release agli sviluppatori per eseguire i vari test, con [...]]]></description>
			<content:encoded><![CDATA[<p>Era davvero un po&#8217; di tempo che se ne parlava ed ora sembra proprio che ci siamo! <a href="http://tomcat.apache.org/index.html" target="_blanck"><strong>Apache Tomcat 7</strong></a> è finalmente sulla buona strada: l&#8217;ultima versione del popolare contenitore di servlet è arrivato alla fase finale dello sviluppo <img src='http://www.alessandrostella.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Ad oggi, sono state rese disponibili quattro client-release agli sviluppatori per eseguire i vari test, con la RC4 rilasciata appena la mattina dell&#8217;8 giugno.<br />
Tomcat 7 sarà perfettamente allineato alle specifiche Servlet 3.0, offrendo una serie di vantaggi interessanti per gli utenti Tomcat, tra cui:</p>
<ul>
<li>Supporto alle annotation</li>
<li>Configurazione dinamica delle librerie tramite codice inserito nel web.xml</li>
<li>Embedding semplificato</li>
<li>Miglioramento del secure session tracking</li>
</ul>
<p>Controlla le note di rilascio di Apache Tomcat 7, oppure vai semplicemente alla <a href="http://people.apache.org/~markt/dev/tomcat-7/v7.0.0-RC4/" target="_blanck">pagina di download della RC4</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/java/2010/06/tomcat-7-e-arrivato/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java, ciclo di vita degli oggetti e garbage collection</title>
		<link>http://www.alessandrostella.it/java/2010/04/java-ciclo-di-vita-degli-oggetti-garbage-collection/</link>
		<comments>http://www.alessandrostella.it/java/2010/04/java-ciclo-di-vita-degli-oggetti-garbage-collection/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 15:32:25 +0000</pubDate>
		<dc:creator>Alessandro</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[garbage collector]]></category>
		<category><![CDATA[heap]]></category>
		<category><![CDATA[runtime stack]]></category>

		<guid isPermaLink="false">http://www.alessandrostella.it/?p=953</guid>
		<description><![CDATA[Su questo argomento si trova davvero poco online&#8230; davvero poco (almeno in italiano). Effettivamente si può considerare un argomento &#8220;di nicchia&#8221;, ma come si fa a non conoscere certi argomenti e poi esigere di esser chiamati &#8220;programmatori java&#8221;? Comunque sia, chiariamo subito una cosa che sembra essere poco chiara: In java, il ciclo di vita [...]]]></description>
			<content:encoded><![CDATA[<p>Su questo argomento si trova davvero poco online&#8230; davvero poco (almeno in italiano). Effettivamente si può considerare un argomento &#8220;di nicchia&#8221;, ma come si fa a non conoscere certi argomenti e poi esigere di esser chiamati &#8220;programmatori java&#8221;?<br />
Comunque sia, chiariamo subito una cosa che sembra essere poco chiara:<br />
<strong>In java, il ciclo di vita di un oggetto parte dal momento della sua creazione (cioè quando si usa la parola chiave <em>new</em>) e finisce quando l&#8217;oggetto è eliminato dal garbage collector.</strong><br />
In java l&#8217;allocamento degli oggetti nella RAM avviene in uno spazio di memoria riservato che prende il nome di <strong>heap</strong>. Per quanto questo spazio possa essere grande, esso è comunque finito e può quindi saturarsi. Per questo motivo la JVM, di tanto in tanto, ripulisce la heap dagli oggetti non più necessari. A tale scopo essa usa il <strong>garbage collector (gc)</strong>. Esso è autonomamente in grado di decidere quali oggetti eliminare e quali no. Ma come fa questo strumento a prendere tali decisioni? Per rispondere a questa domanda dobbiamo necessariamente addentrarci nelle attività svolte dalla JVM.<br />
Java è un sistema thread-based multitasking. Paroloni da paura che per adesso lasciamo così come sono. Quello che ci interessa sapere è che ogni thread ha il proprio <strong>runtime stack</strong> il quale viene usato per gestire l&#8217;esecuzione dei metodi. Ogni elemento di questo stack viene chiamato <strong>activation record</strong> e corrisponde ad una chiamata di un metodo. <strong>E&#8217; proprio analizzando il runtime stack dei vari thread attivi che il garbage collector riesce a comprendere quale oggetto lasciare vivo e quale eliminare! Se il gc trova nella heap un oggetto che non ha alcun riferimento nei vari runtime stack e non viene richiamato da altri oggetti, allora il gc procede alla eliminazione dalla RAM di quell&#8217;oggetto</strong>, liberando memoria.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/java/2010/04/java-ciclo-di-vita-degli-oggetti-garbage-collection/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Java, anonymous classes (classi anonime)</title>
		<link>http://www.alessandrostella.it/java/2010/04/java-anonymous-classes/</link>
		<comments>http://www.alessandrostella.it/java/2010/04/java-anonymous-classes/#comments</comments>
		<pubDate>Sat, 17 Apr 2010 16:02:58 +0000</pubDate>
		<dc:creator>Alessandro</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[anonymous class]]></category>
		<category><![CDATA[inner class]]></category>

		<guid isPermaLink="false">http://www.alessandrostella.it/?p=925</guid>
		<description><![CDATA[Un&#8217;anonymous class (classe anonima) è una inner class che viene contemporaneamente definita e istanziata e non ha un nome. Un&#8217;anonymous class (classe anonima) esiste se e soltanto se esiste una super classe da estendere o un&#8217;interfaccia da implementare! Quando estende una classe, la sintassi dichiarativa assume la seguente forma: new &#60;nome superclasse&#62; (&#60;lista opzionale di [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Un&#8217;anonymous class (classe anonima) è una inner class che viene contemporaneamente definita e istanziata e non ha un nome</strong>.<br />
Un&#8217;anonymous class (classe anonima) esiste se e soltanto se esiste una super classe da estendere o un&#8217;interfaccia da implementare!<br />
Quando estende una classe, la sintassi dichiarativa assume la seguente forma:<br />
<strong>new &lt;<em>nome superclasse</em>&gt; (&lt;<em>lista opzionale di argomenti</em>&gt;) {&#8230;}</strong><br />
Quando invece implementa un&#8217;interfaccia, assume la seguente forma:<br />
<strong>new &lt;<em>nome interfaccia</em>&gt; () {&#8230;}</strong><br />
Bisogna osservare che sebbene una classe anonima estenda una classe o implementi un&#8217;interfaccia, essa non usa né la clausola <em>extends</em> né la clausola <em>implements</em>.<br />
Inoltre, come per le <a href=http://www.alessandrostella.it/java/2010/04/java-local-classes/">local classes</a>, anche le anomymous classes non possono usare la parola chiave <em>static</em>  in fase di dichiarazione.<br />
[to be continued...]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/java/2010/04/java-anonymous-classes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java, local classes</title>
		<link>http://www.alessandrostella.it/java/2010/04/java-local-classes/</link>
		<comments>http://www.alessandrostella.it/java/2010/04/java-local-classes/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 10:01:25 +0000</pubDate>
		<dc:creator>Alessandro</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[inner class]]></category>
		<category><![CDATA[local class]]></category>

		<guid isPermaLink="false">http://www.alessandrostella.it/?p=899</guid>
		<description><![CDATA[Per local class (classe locale) si intende una inner class che è definita in un blocco di codice. Un blocco di codice potrebbe essere il corpo di un metodo, di un costruttore, un blocco locale, un inizializzatore statico o un inizializzatore di istanza. Alcune caratteristiche di una local class: una local class non può avere [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Per local class (classe locale) si intende una inner class che è definita in un blocco di codice</strong>. Un blocco di codice potrebbe essere il corpo di un metodo, di un costruttore, un blocco locale, un inizializzatore statico o un inizializzatore di istanza.<br />
Alcune caratteristiche di una local class:</p>
<ul>
<li>una local class non può avere memebri statici (questo però non esclude la possibilità di avere un membro <em>final static</em>, essendo esso una costante)</li>
<li>una local class non può avere modificatori di accessibilità (public, private, ecc.). Sarà quindi dichiarata scrivendo semplicemente <em>class nomeClasse {&#8230;}</em>
	</li>
<li>una local class può estendere un&#8217;altra classe</li>
<li>all&#8217;interno del blocco in cui è definita, una local class può accedere solo ai membri dichiarati <em>final</em></li>
<li>una non-static local class può accedere sia ai membri statici sia ai membri non statici della classe contenitore (da non confondere con il blocco contenitore)
</li>
<li>una static local class può accedere solo ai membri statici della classe che la contiene</li>
<li>una local class (essendo locale) può essere istanziata solo nel blocco nel quale è definita e deve essere dichiarata prima di essere utilizzata</li>
</ul>
<p>Prima accortezza: se il blocco contenente la dichiarazione della local class è definito in un contesto statico (ad esempio un metodo statico o un inizializzatore statico) allora la local class è implicitamente statica e quindi non richiede alcun oggetto contenitore per essere istanziata.<br />
Facciamo però attenzione al fatto che, sebbene in certi contesti (appena visti) la local class è intesa implicitamente statica, essa non consente di utilizzare nella propria dichiarazione la parola chiave <em>static</em>. Mai.<br />
Facciamo anche attenzione al fatto che se una local class si trova dichiarata in un contesto statico, ciò influenzerà quello che la local class può &#8220;vedere&#8221; nel contesto contenitore.<span id="more-899"></span><br />
Possiamo leggere i commenti nel seguente esempio per chiarirci (spero) le idee&#8230;</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> EsempioLocalClass<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> varNonStatica <span style="color: #339933;">=</span> <span style="color: #cc66cc;">15</span><span style="color: #339933;">;</span> <br />
<br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">void</span> metodoNonStatico <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> param<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> flv <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> hlv <span style="color: #339933;">=</span> <span style="color: #cc66cc;">30</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">int</span> nflv <span style="color: #339933;">=</span> <span style="color: #cc66cc;">20</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">class</span> localClassNonStatica <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// dichiarazione local class. siamo nel metodo &quot;metodoNonStatico&quot;, non dimentichiamolo</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">int</span> f1<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// errore! Non si possono dichiarare variabili static non final in una local class</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">int</span> f2 <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// va bene. Varibile final static consentita in una local class</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">int</span> f3 <span style="color: #339933;">=</span> param<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// tutto ok. Abbiamo visibilità della costante param</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">int</span> f4 <span style="color: #339933;">=</span> flv<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// ok. flv appartiene al metodo contenitore ad è final</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">int</span> f5 <span style="color: #339933;">=</span> nflv<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// errore! Del blocco contenitore possiamo &quot;vedere&quot; solo le variabili definite &quot;final&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">int</span> f6 <span style="color: #339933;">=</span> varNonStatica<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// ok. varNonStatica è dichiarata nella Top Level Class, quindi è visibile nella local class</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> metodoStatico <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> param<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// attenzione! Questo è un metodo statico... quindi?</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> flv <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> hlv <span style="color: #339933;">=</span> <span style="color: #cc66cc;">30</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">int</span> nflv <span style="color: #339933;">=</span> <span style="color: #cc66cc;">20</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">class</span> localClassImplicitamenteStatica <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">int</span> f1<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// errore! Repetita iuvant: niente static non final in una local class</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">int</span> f2 <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// va bene invece una final static</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">int</span> f3 <span style="color: #339933;">=</span> param<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// ok. param appartine al metodo contenitore ed è final</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">int</span> f4 <span style="color: #339933;">=</span> flv<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// ok. flv appartine al metodo contenitore ed è final</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">int</span> f5 <span style="color: #339933;">=</span> nflv<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// errore! nflv non è final</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">int</span> f6 <span style="color: #339933;">=</span> varNonStatica<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// errore! Ora la nostra local class è implicitamente statica e quindi non abbiamo accesso alle variabili della Top Level Class (a meno che non siano dichiarate static)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/java/2010/04/java-local-classes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java, non-static member class</title>
		<link>http://www.alessandrostella.it/java/2010/04/java-non-static-member-class/</link>
		<comments>http://www.alessandrostella.it/java/2010/04/java-non-static-member-class/#comments</comments>
		<pubDate>Sun, 04 Apr 2010 09:36:42 +0000</pubDate>
		<dc:creator>Alessandro</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[inner class]]></category>

		<guid isPermaLink="false">http://www.alessandrostella.it/?p=883</guid>
		<description><![CDATA[Una non-static member class è una inner class definita senza la keyword static (vedere il punto (2) dell&#8217;esempio sotto). Bisogna osservare che: Un&#8217;istanza di una non-static member class può esistere solo e soltanto insieme all&#8217;istanza della classe che la contiene Una non-static member class non può avere static members (a meno che non siano anche [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Una non-static member class è una inner class definita senza la keyword <em>static</em></strong> (vedere il punto (2) dell&#8217;esempio sotto).<br />
Bisogna osservare che:</p>
<ul>
<li>Un&#8217;istanza di una non-static member class può esistere solo e soltanto insieme all&#8217;istanza della classe che la contiene
</li>
<li>Una non-static member class non può avere static members (a meno che non siano anche <em>final</em>)</li>
<li>Il codice scritto in una non-static member class può avere accesso diretto a ogni membro (inclusi i nested) anche se dichiarato <em>private</em>
</li>
</ul>
<p>Vediamo un esempio con un po&#8217; di casi particolari.</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MyLinkedList <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> message <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Shine the light&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// (1)</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> Node makeInstance <span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> info, Node next<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> Node<span style="color: #009900;">&#40;</span>info, next<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Node <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// (2) non-static member class (NSMC)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">int</span> maxNumOfNodes <span style="color: #339933;">=</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> nodeInfo<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> Node next<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> message <span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;Messaggio dal Nodo &quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// (3)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> Node<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nodeInfo, Node next<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">nodeInfo</span> <span style="color: #339933;">=</span> nodeInfo<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">next</span> <span style="color: #339933;">=</span> next<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; @Override<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> toString<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; message <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Modifica del message di Node&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// (4)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> MyLinkedList.<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">message</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; in &quot;</span> <span style="color: #339933;">+</span> nodeInfo <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; (&quot;</span> <span style="color: #339933;">+</span> maxNumOfNodes <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;)&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// (5)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ListClient <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; MyLinkedList list <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MyLinkedList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; MyLinkedList.<span style="color: #006633;">Node</span> node1 <span style="color: #339933;">=</span> list.<span style="color: #006633;">makeInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;node1&quot;</span>, <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; MyLinkedList.<span style="color: #006633;">Node</span> node2 <span style="color: #339933;">=</span> list.<span style="color: #006633;">makeInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;node2&quot;</span>, node1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>node2.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Osserviamo il punto (4).<br />
Viene modificato il valore asseganto all&#8217;attributo di tipo stringa <em>message</em>. Ma esistono 2 attributi di tipo stringa denominati <em>message</em>! Li vediamo dichiarati al punto (1) e al punto (3), entrambi <em>private</em>. Il <em>message</em> al punto (1) appartiene alla classe contenitore (MyLinkedList), mentre quello dichiarato al punto (4) appartiene alla non-static inner class (Node). Abbiamo detto che in una non-static member class possiamo riferirci a qualunque membro, anche dichiarato <em>private</em>, anche appartenente alla classe contenitore. Ma come possiamo riferisci all&#8217;attributo message del contenitore? Lo si può fare con un uso particolare della parole chiave <em>this</em>. Osserviamo a tal riguardo il punto (5).</p>
<p>ATTENZIONE.<br />
Se non fosse stato dichiarato l&#8217;attributo al punto (4), allora scrivendo</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">return</span> message <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; in &quot;</span> <span style="color: #339933;">+</span> nodeInfo <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; (&quot;</span> <span style="color: #339933;">+</span> maxNumOfNodes <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;)&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// (5a)</span></div></td></tr></tbody></table></div>
<p>non si avrebbe alcun errore (come invece ci si potrebbe aspettare), poiché ci riferiremmo, in modo implicito, all&#8217;attributo <em>message</em> della classe contenitore!!!<br />
Facciamo attenzione a questo caso particolare!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/java/2010/04/java-non-static-member-class/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java 1.6, nested type e inner classes</title>
		<link>http://www.alessandrostella.it/java/2010/02/java-1-6-nested-type-e-inner-classes/</link>
		<comments>http://www.alessandrostella.it/java/2010/02/java-1-6-nested-type-e-inner-classes/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 16:13:29 +0000</pubDate>
		<dc:creator>Alessandro</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[anonymous class]]></category>
		<category><![CDATA[inner class]]></category>
		<category><![CDATA[nested class]]></category>

		<guid isPermaLink="false">http://www.alessandrostella.it/?p=645</guid>
		<description><![CDATA[Che confusione! Sui tipi annidati (nested type) e la classi interne (inner classes) in giro per la rete ci sono scritte un sacco di fregnacce! Probabilmente perché la SUN, a partire dalla versione 1.4 di java, ha fatto un po&#8217; di casini con la nomenclatura, modificando il significato di alcuni termini. Comunque sia, ora proviamo [...]]]></description>
			<content:encoded><![CDATA[<p>Che confusione!<br />
Sui tipi annidati (nested type) e la classi interne (inner classes) in giro per la rete ci sono scritte un sacco di fregnacce! Probabilmente perché la SUN, a partire dalla versione 1.4 di java, ha fatto un po&#8217; di casini con la nomenclatura, modificando il significato di alcuni termini. Comunque sia, ora proviamo a fare chiarezza.<br />
Per prima cosa mettiamo in chiaro un concetto: le definizioni in informatica si danno e si usano in inglese. Ci si può riferire al corrispondente termine italiano per meglio comprendere di cosa si parla, ma è l&#8217;inglese che rende univoco un concetto o una definizione.<br />
Torniamo quindi all&#8217;Università e alle definizioni <img src='http://www.alessandrostella.it/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Definizione:<br />
Con il termine <strong>nested type</strong> (tipi annidati) si intende indicare:</p>
<ul>
<li>nested classes</li>
<li>nested enums</li>
<li>nested interfaces</li>
</ul>
<p>Definizione:<br />
Con il termine <strong>nested class</strong> (classe annidata) si intende una classe dichiarata all&#8217;interno di un&#8217;altra classe.<br />
Allo stesso modo si definisono le nested enum e le nested interface.<br />
Ci sono 4 tipi di nested classes:</p>
<ol>
<li>static member classes, enums e interfaces</li>
<li><a href="http://www.alessandrostella.it/java/2010/04/java-non-static-member-class/">non-static member classes</a></li>
<li><a href="http://www.alessandrostella.it/java/2010/04/java-local-classes/">local classes</a></li>
<li><a href="http://www.alessandrostella.it/java/2010/04/java-anonymous-classes/">anonymous classes</a></li>
</ol>
<p>Definizione:<br />
Con il termine <strong>inner class</strong> (classe interna) si indica una qualsiasi nested class purché NON di tipo 1 (vedi definizione precedente).</p>
<p>Facciamo un esempio commentato a dovere:</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">class</span> Alessandro <span style="color: #009900;">&#123;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// (1) Top level class</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">class</span> SMC <span style="color: #009900;">&#123;</span><span style="color: #666666; font-style: italic;">/*...*/</span><span style="color: #009900;">&#125;</span>&nbsp; <span style="color: #666666; font-style: italic;">// (2) Static member class</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">interface</span> SMI <span style="color: #009900;">&#123;</span><span style="color: #666666; font-style: italic;">/*...*/</span><span style="color: #009900;">&#125;</span> &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// (3) Static member interface</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">class</span> NSMC <span style="color: #009900;">&#123;</span><span style="color: #666666; font-style: italic;">/*...*/</span><span style="color: #009900;">&#125;</span>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// (4) Non-static member (inner) class</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">void</span> nsm<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">class</span> NSLC <span style="color: #009900;">&#123;</span><span style="color: #666666; font-style: italic;">/*...*/</span><span style="color: #009900;">&#125;</span>&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// (5) Local (inner) class in non-static context</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> sm<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">class</span> SLC <span style="color: #009900;">&#123;</span><span style="color: #666666; font-style: italic;">/*...*/</span><span style="color: #009900;">&#125;</span> &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// (6) Local (inner) class in static context</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; SMC nsf <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SMC<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// (7) Anonymous (inner) class in non-static context</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">/*...*/</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">static</span> SMI sf <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SMI<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// (8) Anonymous (inner) class in static context</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">/*...*/</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">enum</span> SME <span style="color: #009900;">&#123;</span><span style="color: #666666; font-style: italic;">/*...*/</span><span style="color: #009900;">&#125;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// (9) Static member enum</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/java/2010/02/java-1-6-nested-type-e-inner-classes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java, l&#8217;ereditarietà e i reference</title>
		<link>http://www.alessandrostella.it/java/2009/12/java-lereditarieta-e-i-reference/</link>
		<comments>http://www.alessandrostella.it/java/2009/12/java-lereditarieta-e-i-reference/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 23:36:30 +0000</pubDate>
		<dc:creator>Alessandro</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[OO Programming]]></category>
		<category><![CDATA[ereditarietà]]></category>
		<category><![CDATA[reference]]></category>

		<guid isPermaLink="false">http://www.alessandrostella.it/?p=368</guid>
		<description><![CDATA[Ma abbiamo davvero capito come vengono gestiti i reference in java? Piccolo snippet per metterci alla prova. Ammettiamo di avere 2 classi ClasseA ClasseB e che ClasseB sia una sottoclasse di ClasseA ossia &#8220;ClasseB extends ClasseA&#8221;. Ora, supponendo che le classi si trovino tutte nello stesso package, scriviamo questo codice nel nostro main method: 12345678ClasseA [...]]]></description>
			<content:encoded><![CDATA[<p>Ma abbiamo davvero capito come vengono gestiti i reference in java?<br />
Piccolo snippet per metterci alla prova.<br />
Ammettiamo di avere 2 classi</p>
<ul>
<li>ClasseA</li>
<li>ClasseB</li>
</ul>
<p>e che ClasseB sia una sottoclasse di ClasseA ossia &#8220;ClasseB extends ClasseA&#8221;.<br />
<img src="http://www.alessandrostella.it/wp-content/uploads/2009/12/screenshot_0171.png" alt="ClassB extends ClassA" title="ClassB extends ClassA" width="137" height="153" class="alignnone size-full wp-image-377" /><br />
Ora, supponendo che le classi si trovino tutte nello stesso package, scriviamo questo codice nel nostro main method:</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ClasseA a<span style="color: #339933;">;</span><br />
ClasseB b<span style="color: #339933;">;</span><br />
<br />
a <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ClasseA<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
b <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ClasseB<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
a <span style="color: #339933;">=</span> b<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//(1)</span><br />
b <span style="color: #339933;">=</span> a<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//(2)</span></div></td></tr></tbody></table></div>
<p>Problemi?<br />
Il codice scritto funziona? Anzi, compila?<br />
La risposta è, ovviamente, no <img src='http://www.alessandrostella.it/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  e il problema è nell&#8217;ultima riga (2): b = a;<br />
Perché?<br />
Eppure sembra tutto ok!<br />
In (1) abbiamo assegnato b ad a, quindi a = b. Come è mai possibile che scrivendo poi b = a la cosa non sia corretta?<br />
<strong>La spiegazione è nel tipo di dichiarazione iniziale dei reference a e b.</strong><br />
ClasseA è una superclasse di ClasseB, quindi scrivere a = b è possibile per automatico widening (a è &#8220;più grande&#8221; di b). La cosa invece non è possibile in senso inverso perché b è &#8220;più piccolo&#8221; di a e non può quindi &#8220;contenerlo&#8221;.<br />
L&#8217;osservazione più comune a questo punto è:<br />
ma se in (1) abbiamo scritto a = b significa che a e b sono diventati uguali! Quindi come è mai possibile che b = a dia problemi? <img src='http://www.alessandrostella.it/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Già, come è mai possibile?<br />
Leggete il post su <a href="http://www.alessandrostella.it/java/2009/10/java-i-reference-e-la-programmazione-a-oggetti/">java i reference e la RAM</a> e forse ne capirete di più&#8230; <img src='http://www.alessandrostella.it/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/java/2009/12/java-lereditarieta-e-i-reference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java e le asserzioni</title>
		<link>http://www.alessandrostella.it/java/2009/11/java-e-le-asserzioni/</link>
		<comments>http://www.alessandrostella.it/java/2009/11/java-e-le-asserzioni/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 18:24:57 +0000</pubDate>
		<dc:creator>Alessandro</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[assert]]></category>
		<category><![CDATA[assertion]]></category>
		<category><![CDATA[asserzioni]]></category>

		<guid isPermaLink="false">http://www.alessandrostella.it/?p=270</guid>
		<description><![CDATA[Molti le nominano, pochi le usano, meno le conoscono. Eppure sono moderatamente utili e molto semplici da usare&#8230; In java una 1assert è un&#8217;affermazione che il programmatore fa in un certo punto del codice da lui scritto.. Il compilatore si occupa di verificare che tale affermazione sia corretta, in caso contrario lancia un&#8217;eccezione di tipo [...]]]></description>
			<content:encoded><![CDATA[<p>Molti le nominano, pochi le usano, meno le conoscono.<br />
Eppure sono moderatamente utili e molto semplici da usare&#8230;<br />
<strong>In java una</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">assert</div></td></tr></tbody></table></div>
<p>è un&#8217;affermazione che il programmatore fa in un certo punto del codice da lui scritto.</strong>. Il compilatore si occupa di verificare che tale affermazione sia corretta, in caso contrario lancia un&#8217;eccezione di tipo unchecked. E&#8217; decisamente opportuno disabilitarle in fase di produzione del sistema, mentre possono essere utili in fase di sviluppo e test.</p>
<p><strong>Come si dichiarano?</strong><br />
In 2 modi diversi:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">assert &lt;boolean expression&gt;;<br />
assert &lt;boolean expression&gt;: &lt;message expression&gt;;</div></td></tr></tbody></table></div>
<p>Se ad esempio, in una nostra classe stiamo calcolando la velocità come spazio/tempo, potremmo scrivere:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">assert spazio &gt; 0;<br />
assert tempo &gt; 0: &quot;Il tempo non è un numero positivo!&quot; + tempo;</div></td></tr></tbody></table></div>
<p><strong>Come si abilitano?</strong><br />
Per default le asserzioni sono disabilitate.<br />
Bisogna quindi esplicitamente abilitarle. Ecco come fare:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&gt;java -ea &lt;classe da eseguire&gt;&lt;/classe&gt;</div></td></tr></tbody></table></div>
<p>In questo modo abilitiamo l&#8217;uso delle asserzioni nella nostra classe e in tutte le sue dipendenze, ma non nelle classi di sistema (quelle caricate direttamente dalla JVM). Per abilitare anche quelle ci tocca scrivere:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&gt;java -esa</div></td></tr></tbody></table></div>
<p>L&#8217;errore più clamoroso che si possa commettere nell&#8217;uso di una</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">assert</div></td></tr></tbody></table></div>
<p>è quello di confonderla con la gestione delle eccezzioni!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/java/2009/11/java-e-le-asserzioni/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java e il passaggio di parametri</title>
		<link>http://www.alessandrostella.it/java/2009/11/java-e-il-passaggio-di-parametri/</link>
		<comments>http://www.alessandrostella.it/java/2009/11/java-e-il-passaggio-di-parametri/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 16:16:08 +0000</pubDate>
		<dc:creator>Alessandro</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[parametri attuali]]></category>
		<category><![CDATA[parametri formali]]></category>
		<category><![CDATA[passaggio di parametri]]></category>

		<guid isPermaLink="false">http://www.alessandrostella.it/?p=193</guid>
		<description><![CDATA[Il sistema utilizzato da java per passare parametri ai metodi è molto semplice, eppure nella mia breve storia di programmatore java in molti mi hanno chiesto delucidazioni su questo argomento. In base alla mia esperienza posso dire che avere problemi nel capire come funziona il passaggio dei parametri in java significa avere problemi con reference [...]]]></description>
			<content:encoded><![CDATA[<p>Il sistema utilizzato da java per passare parametri ai metodi è molto semplice, eppure nella mia breve storia di programmatore java in molti mi hanno chiesto delucidazioni su questo argomento. In base alla mia esperienza posso dire che avere problemi nel capire come funziona il passaggio dei parametri in java significa avere problemi con <a href="http://www.alessandrostella.it/java/2009/10/java-i-reference-e-la-programmazione-a-oggetti/">reference</a> e <a href="http://www.alessandrostella.it/java/2009/11/java-e-i-dati-primitivi-e-la-ram/">dati primitivi</a>.<br />
Quindi, per prima cosa, vi rimando alla lettura di tali post!</p>
<p>Se avete chiara la differenza tra un reference e un dato primitivo, diventa tutto facile.<br />
<strong>In java i parametri vengono sempre passati per valore e sempre duplicati con copie locali al metodo.</strong><br />
Dovrebbe però essere chiaro che duplicare una variabile di tipo primitivo è diverso dal duplicare una varibile di tipo reference! <strong>Duplicare un reference significa avere 2 reference che puntano allo stesso oggetto!</strong> Ecco perché quando in un metodo modifico il valore di un parametro di tipo primitivo esso non modifica il valore del parametro fuori dal metodo, mentre quando uso un parametro di tipo reference ogni modifica apportata all&#8217;oggetto puntato da tale reference viene riflessa sull&#8217;oggetto puntato dal parametro esterno: entrambi i reference (essendo uno la copia dell&#8217;altro) puntano lo stesso oggetto!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/java/2009/11/java-e-il-passaggio-di-parametri/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Java, i dati primitivi e la RAM</title>
		<link>http://www.alessandrostella.it/java/2009/11/java-e-i-dati-primitivi-e-la-ram/</link>
		<comments>http://www.alessandrostella.it/java/2009/11/java-e-i-dati-primitivi-e-la-ram/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 15:00:43 +0000</pubDate>
		<dc:creator>Alessandro</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[dati primitivi]]></category>

		<guid isPermaLink="false">http://www.alessandrostella.it/?p=191</guid>
		<description><![CDATA[Non molto tempo fa abbiamo cercato di dipanare la matassa intorno alla gestione dei reference. In questo post invece cerchiamo di capire come funzionano i dati primitivi nella memoria del PC. Innanzitutto un dato primitvo NON è un oggetto! Tuttavia, ogni dato primitivo ha una corrispondente wrapper class che può essere usata per rappresnetarlo come [...]]]></description>
			<content:encoded><![CDATA[<p>Non molto tempo fa abbiamo cercato di dipanare la matassa intorno alla gestione dei <a href="http://www.alessandrostella.it/java/2009/10/java-i-reference-e-la-programmazione-a-oggetti/">reference</a>.<br />
In questo post invece cerchiamo di capire come funzionano i dati primitivi nella memoria del PC.<br />
Innanzitutto un <strong>dato primitvo</strong> NON è un oggetto!<br />
Tuttavia, ogni dato primitivo ha una corrispondente <em>wrapper class</em> che può essere usata per rappresnetarlo come un oggetto. Ma in questo post non parleremo di questo.<br />
Ci occuperemo invece di <strong>quali sono i dati primitivi in java e come vengono rappresentati nella RAM</strong> del PC.<br />
Possiamo dividere i dati primitivi in 3 categorie:</p>
<ul>
<li>integral types (byte, short, int, long e char)</li>
<li>floating-point types (float, double)</li>
<li>boolean type (boolean)</li>
</ul>
<p>E&#8217; lecito scrivere:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">int intVar = 10;</div></td></tr></tbody></table></div>
<p>Cosa succede nella RAM del PC quando noi scriviamo una tale istruzione?<br />
La figura di seguito dovrebbe spiegarlo.<br />
<img src="http://www.alessandrostella.it/wp-content/uploads/2009/11/primitiviRAM.gif" alt="Il dato primitivo nella RAM" title="Il dato primitivo nella RAM" width="412" height="230" class="alignnone size-full wp-image-196" /><br />
Nella cella di memoria con sfondo verde è stato inserito il valore del nostro tipo primitivo; in questo caso il valore 10. Da adesso in poi ogni istruzione di modifica della variabile <em>intVar</em> modificherà direttamente il valore contenuto in quella cella di memoria. Quindi scrivendo:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">intVar = 163;</div></td></tr></tbody></table></div>
<p>java modificherà per noi il contenuto della cella in figura.<br />
E&#8217; molto importante notare e capire che java gestisce in modo differente gli oggetti e i dati primitivi.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/java/2009/11/java-e-i-dati-primitivi-e-la-ram/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java, i reference e la RAM</title>
		<link>http://www.alessandrostella.it/java/2009/10/java-i-reference-e-la-programmazione-a-oggetti/</link>
		<comments>http://www.alessandrostella.it/java/2009/10/java-i-reference-e-la-programmazione-a-oggetti/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 12:32:27 +0000</pubDate>
		<dc:creator>Alessandro</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[OO Programming]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[programmazione a oggetti]]></category>
		<category><![CDATA[reference]]></category>

		<guid isPermaLink="false">http://www.alessandrostella.it/?p=166</guid>
		<description><![CDATA[Questo è un argomento ostile, nel quale è facile perdersi, ma nello stesso tempo è la prima porta da aprire se si vuole entrare a pieno titolo nel mondo della programmazione java&#8230; Innanzitutto distinguiamo tra reference value e object reference. Un reference value rappresenta un valore (value) e precisamente il valore che viene restituto quando [...]]]></description>
			<content:encoded><![CDATA[<p>Questo è un argomento ostile, nel quale è facile perdersi, ma nello stesso tempo è la prima porta da aprire se si vuole entrare a pieno titolo nel mondo della programmazione java&#8230;</p>
<p>Innanzitutto distinguiamo tra <strong>reference value</strong> e <strong>object reference</strong>.<br />
Un <strong>reference value</strong> rappresenta un valore (value) e precisamente il valore che viene restituto quando viene creato un particolare oggetto.<br />
Un <strong>object reference</strong> (o semplicemnte reference) rappresenta invece una variabile che può memorizzare un reference value.<br />
Questa differenza deve essere chiara perché altrimenti niente sarà mai chiaro con i reference in java!<br />
Ora traduciamo questi concetti in codice.<br />
Creiamo 2 object reference di tipo MiaClasse:</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">MiaClasse refOggetto1, refOggetto2<span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Scrivendo questa riga di codice abbiamo comunicato a java di creare due variabili (nella RAM del calcolatore) di tipo <em>MiaClasse</em> e gli abbiamo anche detto che in queste 2 variabili DOVRANNO essere inseriti dei valori che si riferiranno (reference) a 2 oggetti di tipo <em>MiaClasse</em>. Stiamo parlando di &#8220;reference&#8221;! Questo significa che in queste 2 variabili java NON inserirà MAI gli oggetti veri e propri, ma il rifeimento a tali oggetti!!!<br />
Rileggete bene l&#8217;ultimo paragrafo: è molto importante!</p>
<p>Bene. Inseriamo allora tali riferimenti ai 2 oggetti:</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">refOggetto1 <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MiaClasse<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
refOggetto2 <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MiaClasse<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>A questo punto java assegna un valore a <em>refOggetto1</em> e un altro valore a <em>refOggetto2</em>. Ribadisco ancora che tale valore NON indica l&#8217;oggetto vero e proprio, ma indica la posizione (in RAM) dell&#8217;oggetto; il suo &#8220;riferimento&#8221;.<br />
Si può rappresentare graficamente quanto detto con la seguente figura (scusate la poca eleganza).</p>
<p><img src="http://www.alessandrostella.it/wp-content/uploads/2009/10/ram.gif" alt="Oggetti in RAM" title="Oggetti in RAM" width="412" height="230" class="alignnone size-full wp-image-399" /></p>
<p>In questa figura c&#8217;è rappresentato tutto quello che bisogna sapere sui reference!<br />
<span id="more-166"></span><br />
Perché i reference <em>refOggetto1</em> e <em>refOggetto2</em> hanno uno sfondo bicolore?<br />
La risposta a questa domanda svelerà uno dei segreti di java&#8230;<br />
<strong>Nei reference non viene inserito soltanto l&#8217;indirizzo di memoria in cui è memorizzato l&#8217;oggetto, ma anche l&#8217;intervallo di memoria che sarà occupato dall&#8217;oggetto!</strong><br />
Quindi è come se nella parte verde chiaro ci fosse scritto l&#8217;indirizzo RAM dove &#8220;inizia&#8221; l&#8217;oggetto che ci interessa, mentre nella parte verde scuro fosse indicato lo spazio da sommare al punto iniziale per contenere l&#8217;oggetto.<br />
Vi siete mai chiesti perché scrivere:</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>MiaClasse.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>procuri un output simile al seguente?</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">MiaClasse@c3c749</div></td></tr></tbody></table></div>
<p>La @ è il separatore tra la parte verde chiaro e quella verde scuro!</p>
<p>Ora comprendere a fondo questo concetto sarà di fondamentale importanza quando parleremo di polimorfismo e di metodi virtuali!</p>
<p>In java NON avremo mai a che fare con gli oggetti veri e propri (indicati con lo sfondo rosa nella figura), ma solo con i loro riferimenti (sfondo verde).<br />
Ecco perché quando noi scriviamo:</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">refOggetto2 <span style="color: #339933;">=</span> refOggetto1<span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>NON stiamo rendendo uguali gli oggetti e in realtà non stiamo rendendo uguali neanche i reference, ma solo una parte dei reference, cioè la parte che indica dove inizia l&#8217;oggetto in memoria.<br />
Questo significa che dopo tale istruzione refOggetto2 punterà allo stesso indirizzo di memoria a cui punta refOggetto1 e quindi se noi apportiamo una modifica all&#8217;oggetto puntato da refOggetto2 la ritroviamo anche sull&#8217;oggetto puntato da refOggetto1; per forza! Entrambi puntano allo stesso oggetto!<br />
<img src="http://www.alessandrostella.it/wp-content/uploads/2009/10/ram2.gif" alt="Uguagliare 2 reference" title="Uguagliare 2 reference" width="412" height="230" class="size-full wp-image-405" /><br />
L&#8217;oggetto a cui puntava refOggetto2 rimarrà in memoria fino a quando java, tramite il suo garbage collector, non si accorgerà che nessuno lo &#8220;cerca&#8221; e lo eliminerà.</p>
<p>Ma tutto quanto detto è valido solo e soltanto se i 2 reference sono stati dichiarati dello stesso tipo (come nel nostro caso)!<br />
Se invece avessimo scritto:</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">MiaClasse refOggetto1<span style="color: #339933;">;</span><br />
MiaClasse2 refOggetto2<span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>e se non ci fosse legame tra le 2 classi, scrivere:</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">refOggetto2 <span style="color: #339933;">=</span> refOggetto1<span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>produrrebbe un errore in compilazione!</p>
<p>Abbiamo già visto che con i dati primitivi le cose funzionano ben diversamente, ma vi rimando ai relativi post.<br />
<a href="http://www.alessandrostella.it/java/2009/11/java-e-i-dati-primitivi-e-la-ram/">I dati primitivi</a><br />
<a href="http://www.alessandrostella.it/java/2009/11/java-e-il-passaggio-di-parametri/">Il passaggio dei parametri</a><br />
Gli argomenti sono strettamente collegati.<br />
Per &#8220;evolvere&#8221; il pensiero invece, è bene leggere questo post: java il polomorfismo e i metodi virtuali.<br />
Mal di testa? E&#8217; normale&#8230; passerà!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/java/2009/10/java-i-reference-e-la-programmazione-a-oggetti/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
