<?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>Sat, 04 Feb 2012 20:57:05 +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/guide-e-manuali/2010/07/jasper-report-ireport-java/</link>
		<comments>http://www.alessandrostella.it/guide-e-manuali/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[guide e manuali]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[iReport]]></category>
		<category><![CDATA[jasper report]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.alessandrostella.it/?p=1169</guid>
		<description><![CDATA[Dobbiamo produrre dei report 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 [...]<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/guide-e-manuali/2010/10/ireport-report-complessi/" rel="bookmark">iReport e report complessi</a><!-- (14.1)--></li>
	    	    <li><a href="http://www.alessandrostella.it/guide-e-manuali/2010/10/ireport-nascondere-una-sezione-assenza-di-dati/" rel="bookmark">iReport: nascondere una sezione in assenza di dati</a><!-- (12.7)--></li>
	    	    <li><a href="http://www.alessandrostella.it/varie/2010/11/jasper-report-pdf-stampe/" rel="bookmark">Jasper report serve per fare report, non semplici stampe</a><!-- (11.6)--></li>
	            </ol>
    </div>]]></description>
			<content:encoded><![CDATA[<p>Dobbiamo produrre dei report 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 rel="lytebox" href="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReport_01.jpg"><img class="aligncenter size-medium wp-image-1171" title="iReport - Schermata di benvenuto" src="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReport_01-300x225.jpg" alt="iReport - Schermata di benvenuto" width="300" height="225" /></a><br />
E&#8217; bene chiarire che <strong>non siamo</strong> di certo<strong> costretti a seguire l&#8217;iter appena indicato</strong>. Possiamo tranquillamente selezionare &#8220;File/Nuovo&#8230;&#8221;, scegliere il nostro layout preferito e premere &#8220;Open this template&#8221;. In questo caso però è bene aprire il file appena creato in visualizzazione XML ed eliminare l&#8217;attributo &#8220;language&#8221; del tag  &lt;jasperReport&gt;.<br />
Si, ma allora perché fare tutto quel giro? Perché in quel modo iReport ci consente di vedere in diretta quello che creiamo. Vediamo allora di seguire l&#8217;iter indicato.<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><span style="text-decoration: underline;">Database JDBC connection</span><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 &gt;&#8221;. Qui di seguito possiamo osservare la schermata che ci viene proposta da iReport dopo la pressione del pulsante &#8220;Avanti&gt;&#8221;.<br />
<a rel="lytebox" href="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReport_02.jpg"><img class="aligncenter size-medium wp-image-1172" title="iReport_02 - Database JDBC connection" src="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReport_02-257x300.jpg" alt="iReport_02 - Database JDBC connection" width="257" height="300" /></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 e poi strumenti/opzioni/Classpath/Add Jar e aggiungiamo il jar.<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 (nell&#8217;immagine qui sotto indicata con &#8220;Fasi&#8221;).<br />
<img src="http://www.alessandrostella.it/wp-content/uploads/2010/07/sorgenteDatiDB.jpg" alt="Sorgente dati DB" title="Sorgente dati DB" width="467" height="174" class="aligncenter size-full wp-image-1332" /><br />
E adesso? Ora che abbiamo la fonte dati possiamo usarla per compilare il nostro report. Clicchiamo con il destro sul nome del report e scegliamo la voce &#8220;Edit Query&#8221; (come mostrato nella figura che segue).<br />
<img src="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReportEditQuery.jpg" alt="iReport: Edit Query" title="iReport: Edit Query" width="502" height="286" class="aligncenter size-full wp-image-1334" /><br />
Si aprirà l&#8217;interfaccia mostrata qui di seguito, nella quale non dobbiamo fare altro che inserire la nostra query SQL e premere il pulsante &#8220;Read fields&#8221;.<br />
<img src="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReportReportQuery.jpg" alt="iReport: ReportQuery" title="iReport: ReportQuery" width="505" height="359" class="aligncenter size-full wp-image-1335" />Come per miracolo in basso vedremo l&#8217;elenco dei campi del DB. Scegliamo &#8220;OK&#8221; e torniamo sul nostro report. Nella sezione &#8220;Report inspector&#8221; (sulla sinistra) avremo la voce &#8220;Campi&#8221; riempita con i nomi delle colonne del DB. Non ci resta che selezionare una colonna e trascinarla sul nostro report, nella sezione in cui vogliamo che compaia.</p>
<p><span style="text-decoration: underline;">XML file datasource</span><br />
Se la nostre fonte dati è un file XML, ci basta scegliere XML file datasource al &#8220;Passo 1&#8243; e premere &#8220;Avanti &gt;&#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 /></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;documento<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>Valore 1<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 2<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>Valore 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 />
<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 rel="lytebox" href="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReportNewTable.jpg"><img class="aligncenter size-medium wp-image-1225" title="creazione nuova Table" src="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReportNewTable-450x325.jpg" alt="creazione nuova Table" width="450" height="325" /></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&gt;&#8221;. Nella schermata successiva andiamo a cercare la sorgente dati che fa riferimento al file XML. Ora sempre &#8220;Avanti&gt;&#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 rel="lytebox" href="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReportQueryLanguage.jpg"><img class="aligncenter size-medium wp-image-1227" title="iReport - Query Language" src="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReportQueryLanguage-450x355.jpg" alt="iReport - Query Language" width="450" height="355" /></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 rel="lytebox" href="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReportEditTable.jpg"><img class="aligncenter size-medium wp-image-1229" title="iReport - Edit table" src="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReportEditTable-450x316.jpg" alt="iReport - Edit table" width="450" height="316" /></a><br />
Ora effettuiamo la sostituzione di cui si è parlato all&#8217;inizio di questo paragrafo (&#8220;dataSourceExpression&#8221;).</p>
<p><span style="text-decoration: underline;">JavaBeans set datasource</span><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</p>
<blockquote><p>&#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: #003399;">Collection</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: #003399;">Collection</span> persone <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ArrayList</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 class="aligncenter size-medium wp-image-1194" title="iReport - JavaBeans datasource" src="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReport_03-386x450.jpg" alt="iReport - JavaBeans datasource" width="386" height="450" /><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 rel="lytebox" href="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReport_04.jpg"><img class="aligncenter size-medium wp-image-1210" title="iReport - Recupero dati dalla collection" src="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReport_04-450x337.jpg" alt="iReport - Recupero dati dalla collection" width="450" height="337" /></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' /><br />
Ue&#8217;, sia chiaro! <strong>Tutto questo discorso sui javabeans serve esclusivamente per vedere da iReport l&#8217;anteprima del nostro report</strong>. Nella nostra applicazione poi le cose son diverse! Non è che dobbiamo creare un metodo statico nel codice!!!<br />
Procediamo nella lettura per capire&#8230;</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.<br />
Una volta terminato il nostro lavoro sul report è opportuno compilarlo per ottenere il file jasper. Per farlo basta premere il bottone evidenziato nelle figura qui sotto.<br />
<a href="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReportCompile1.jpg" rel="lytebox"><img src="http://www.alessandrostella.it/wp-content/uploads/2010/07/iReportCompile1-450x238.jpg" alt="iReport: Compile" title="iReport: Compile" width="450" height="238" class="aligncenter size-medium wp-image-1350" /></a></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 /></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;">private</span> <span style="color: #000066; font-weight: bold;">void</span> sendReportElencoReportXmlPdf<span style="color: #009900;">&#40;</span>HttpServletRequest request,<br />
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 />
<br />
&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; <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span><br />
&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; <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; <span style="color: #666666; font-style: italic;">//String pathFile = request.getRealPath(&quot;&quot;) + &quot;WEB-INF/reports/ricevutaTrasfProgrTriennale.jasper&quot;;</span><br />
&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; <span style="color: #003399;">Map</span> lParameters <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">HashMap</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&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; <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><br />
&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; <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; 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; DocumentBuilder db<span style="color: #339933;">;</span><br />
&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; <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; <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; 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; 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; <span style="color: #666666; font-style: italic;">//JRXmlDataSource xmlDS = new JRXmlDataSource(in,&quot;/trasferimenti/trasferimento&quot;);</span><br />
&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 />
<br />
&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; 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; 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; 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; 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; <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; 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; <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; 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; <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; 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; <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; 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; <span style="color: #009900;">&#125;</span><br />
<br />
&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; 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; <span style="color: #666666; font-style: italic;">//response.setContentLength(out.size());</span><br />
&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; 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; 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 />
<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>, possiamo procedere 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 />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 />51<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;">private</span> <span style="color: #000066; font-weight: bold;">void</span> creaReportDaCollezioneDiBean<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 />
<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: #666666; font-style: italic;">// QUI SETTIAMO EVENTUALI PARAMETRI E VARIABILI CHE SI ASPETTA IL NOSTRO JASPER</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// I QUESTO CASO STIAMO SETTANDO IL PATH IN CUI SI TROVA IL FILE JASPER E</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// IL PATH IN CUI SI TROVA UN'IMMAGINE CHE VERRA' POI STAMPATA NEL NOSTRO REPORT</span><br />
&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/stampaReport.jasper&quot;</span><span style="color: #339933;">;</span><br />
&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/logo.png&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Map<span style="color: #339933;">&lt;</span><span style="color: #003399;">String</span>, 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><span style="color: #003399;">String</span>, 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; lParameters.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;pathImg&quot;</span>, pathFileImg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; log.<span style="color: #006633;">debug</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;PATH JAPSER: &quot;</span> <span style="color: #339933;">+</span> pathFile<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// FINE DEI SETTAGGI DEI PARAMETRI</span><br />
&nbsp; &nbsp; <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; JRDataSource dataSource <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; java.<span style="color: #006633;">util</span>.<span style="color: #006633;">Collection</span><span style="color: #339933;">&lt;</span>EventoSospensioneStampaBean<span style="color: #339933;">&gt;</span> beanCollection <span style="color: #339933;">=</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">new</span> ArrayList<span style="color: #339933;">&lt;</span>EventoSospensioneStampaBean<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; <span style="color: #666666; font-style: italic;">/*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; * &nbsp;QUI SCRIVIAMO IL CODICE PER RIEMPIRE LA NOSTRA COLLEZIONE DI BEAN<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; * &nbsp;UNA VOLTA SETTATI GLI ATTRIBUTI DEL BEAN, LO AGGIUNGIAMO ALLA COLLEZIONE<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; */</span>&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>NostroBean<span style="color: #339933;">!=</span><span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; beanCollection.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>NostroBean<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dataSource <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> JRBeanCollectionDataSource<span style="color: #009900;">&#40;</span>beanCollection<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// QUESTO E' IL CODICE PER COMPILARE IL NOSTRO REPORT JASPER</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>dataSource<span style="color: #339933;">!=</span><span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &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; &nbsp; &nbsp; log.<span style="color: #006633;">debug</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;STO RIMPIENDO IL JASPER&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &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, dataSource<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.<span style="color: #006633;">debug</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;HO RIEMPITO IL JASPER&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &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; &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; &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; &nbsp; &nbsp; <span style="color: #009900;">&#125;</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><span style="color: #003399;">Exception</span> exc<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>exc, exc<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=reportSospensione.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 />
<span style="color: #009900;">&#125;</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>
<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/guide-e-manuali/2010/10/ireport-report-complessi/" rel="bookmark">iReport e report complessi</a><!-- (14.1)--></li>
	    	    <li><a href="http://www.alessandrostella.it/guide-e-manuali/2010/10/ireport-nascondere-una-sezione-assenza-di-dati/" rel="bookmark">iReport: nascondere una sezione in assenza di dati</a><!-- (12.7)--></li>
	    	    <li><a href="http://www.alessandrostella.it/varie/2010/11/jasper-report-pdf-stampe/" rel="bookmark">Jasper report serve per fare report, non semplici stampe</a><!-- (11.6)--></li>
	            </ol>
    </div>]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/guide-e-manuali/2010/07/jasper-report-ireport-java/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>jQuery4j: gestire jQuery da java</title>
		<link>http://www.alessandrostella.it/guide-e-manuali/2010/06/jquery4j-gestire-jquery-da-java/</link>
		<comments>http://www.alessandrostella.it/guide-e-manuali/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[guide e manuali]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[Java]]></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 [...]<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/guide-e-manuali/2010/07/jasper-report-ireport-java/" rel="bookmark">JasperReport, iReport e java</a><!-- (7.3)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-anonymous-classes/" rel="bookmark">Java, anonymous classes (classi anonime)</a><!-- (5.8)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-ciclo-di-vita-degli-oggetti-garbage-collection/" rel="bookmark">Java, ciclo di vita degli oggetti e garbage collection</a><!-- (5.6)--></li>
	            </ol>
    </div>]]></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>
<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/guide-e-manuali/2010/07/jasper-report-ireport-java/" rel="bookmark">JasperReport, iReport e java</a><!-- (7.3)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-anonymous-classes/" rel="bookmark">Java, anonymous classes (classi anonime)</a><!-- (5.8)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-ciclo-di-vita-degli-oggetti-garbage-collection/" rel="bookmark">Java, ciclo di vita degli oggetti e garbage collection</a><!-- (5.6)--></li>
	            </ol>
    </div>]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/guide-e-manuali/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/varie/2010/06/tomcat-7-e-arrivato/</link>
		<comments>http://www.alessandrostella.it/varie/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[software]]></category>
		<category><![CDATA[varie]]></category>
		<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 [...]<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/software/2009/10/tomcat-e-https/" rel="bookmark">Tomcat e HTTPS</a><!-- (13.5)--></li>
	    	    <li><a href="http://www.alessandrostella.it/software/2009/05/jboss-4x-modificare-la-porta-del-servlet-container/" rel="bookmark">Jboss 4.x: modificare la porta del servlet container</a><!-- (11.7)--></li>
	            </ol>
    </div>]]></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>
<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/software/2009/10/tomcat-e-https/" rel="bookmark">Tomcat e HTTPS</a><!-- (13.5)--></li>
	    	    <li><a href="http://www.alessandrostella.it/software/2009/05/jboss-4x-modificare-la-porta-del-servlet-container/" rel="bookmark">Jboss 4.x: modificare la porta del servlet container</a><!-- (11.7)--></li>
	            </ol>
    </div>]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/varie/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/programmazione/2010/04/java-ciclo-di-vita-degli-oggetti-garbage-collection/</link>
		<comments>http://www.alessandrostella.it/programmazione/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[programmazione]]></category>
		<category><![CDATA[garbage collector]]></category>
		<category><![CDATA[heap]]></category>
		<category><![CDATA[Java]]></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 [...]<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/11/java-e-il-passaggio-di-parametri/" rel="bookmark">Java e il passaggio di parametri</a><!-- (13.6)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/10/java-i-reference-e-la-programmazione-a-oggetti/" rel="bookmark">Java, i reference e la RAM</a><!-- (11.6)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/11/java-e-i-dati-primitivi-e-la-ram/" rel="bookmark">Java, i dati primitivi e la RAM</a><!-- (10.4)--></li>
	            </ol>
    </div>]]></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>
<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/11/java-e-il-passaggio-di-parametri/" rel="bookmark">Java e il passaggio di parametri</a><!-- (13.6)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/10/java-i-reference-e-la-programmazione-a-oggetti/" rel="bookmark">Java, i reference e la RAM</a><!-- (11.6)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/11/java-e-i-dati-primitivi-e-la-ram/" rel="bookmark">Java, i dati primitivi e la RAM</a><!-- (10.4)--></li>
	            </ol>
    </div>]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/programmazione/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/programmazione/2010/04/java-anonymous-classes/</link>
		<comments>http://www.alessandrostella.it/programmazione/2010/04/java-anonymous-classes/#comments</comments>
		<pubDate>Sat, 17 Apr 2010 16:02:58 +0000</pubDate>
		<dc:creator>Alessandro</dc:creator>
				<category><![CDATA[programmazione]]></category>
		<category><![CDATA[anonymous class]]></category>
		<category><![CDATA[inner class]]></category>
		<category><![CDATA[Java]]></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 [...]<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-local-classes/" rel="bookmark">Java, local classes</a><!-- (12.2)--></li>
	    	    <li><a href="http://www.alessandrostella.it/guide-e-manuali/2010/07/jasper-report-ireport-java/" rel="bookmark">JasperReport, iReport e java</a><!-- (6)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-ciclo-di-vita-degli-oggetti-garbage-collection/" rel="bookmark">Java, ciclo di vita degli oggetti e garbage collection</a><!-- (5.6)--></li>
	            </ol>
    </div>]]></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>
<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-local-classes/" rel="bookmark">Java, local classes</a><!-- (12.2)--></li>
	    	    <li><a href="http://www.alessandrostella.it/guide-e-manuali/2010/07/jasper-report-ireport-java/" rel="bookmark">JasperReport, iReport e java</a><!-- (6)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-ciclo-di-vita-degli-oggetti-garbage-collection/" rel="bookmark">Java, ciclo di vita degli oggetti e garbage collection</a><!-- (5.6)--></li>
	            </ol>
    </div>]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/programmazione/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/programmazione/2010/04/java-local-classes/</link>
		<comments>http://www.alessandrostella.it/programmazione/2010/04/java-local-classes/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 10:01:25 +0000</pubDate>
		<dc:creator>Alessandro</dc:creator>
				<category><![CDATA[programmazione]]></category>
		<category><![CDATA[inner class]]></category>
		<category><![CDATA[Java]]></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 [...]<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/02/java-1-6-nested-type-e-inner-classes/" rel="bookmark">Java 1.6, nested type e inner classes</a><!-- (18.8)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-non-static-member-class/" rel="bookmark">Java, non-static member class</a><!-- (17.1)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-anonymous-classes/" rel="bookmark">Java, anonymous classes (classi anonime)</a><!-- (16.4)--></li>
	            </ol>
    </div>]]></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>
<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/02/java-1-6-nested-type-e-inner-classes/" rel="bookmark">Java 1.6, nested type e inner classes</a><!-- (18.8)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-non-static-member-class/" rel="bookmark">Java, non-static member class</a><!-- (17.1)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-anonymous-classes/" rel="bookmark">Java, anonymous classes (classi anonime)</a><!-- (16.4)--></li>
	            </ol>
    </div>]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/programmazione/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/programmazione/2010/04/java-non-static-member-class/</link>
		<comments>http://www.alessandrostella.it/programmazione/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[programmazione]]></category>
		<category><![CDATA[inner class]]></category>
		<category><![CDATA[Java]]></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 [...]<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/02/java-1-6-nested-type-e-inner-classes/" rel="bookmark">Java 1.6, nested type e inner classes</a><!-- (17.2)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-local-classes/" rel="bookmark">Java, local classes</a><!-- (15)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-anonymous-classes/" rel="bookmark">Java, anonymous classes (classi anonime)</a><!-- (12.8)--></li>
	            </ol>
    </div>]]></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>
<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/02/java-1-6-nested-type-e-inner-classes/" rel="bookmark">Java 1.6, nested type e inner classes</a><!-- (17.2)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-local-classes/" rel="bookmark">Java, local classes</a><!-- (15)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-anonymous-classes/" rel="bookmark">Java, anonymous classes (classi anonime)</a><!-- (12.8)--></li>
	            </ol>
    </div>]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/programmazione/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/programmazione/2010/02/java-1-6-nested-type-e-inner-classes/</link>
		<comments>http://www.alessandrostella.it/programmazione/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[programmazione]]></category>
		<category><![CDATA[anonymous class]]></category>
		<category><![CDATA[inner class]]></category>
		<category><![CDATA[Java]]></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 [...]<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-anonymous-classes/" rel="bookmark">Java, anonymous classes (classi anonime)</a><!-- (18.7)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-non-static-member-class/" rel="bookmark">Java, non-static member class</a><!-- (14.8)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-local-classes/" rel="bookmark">Java, local classes</a><!-- (13.9)--></li>
	            </ol>
    </div>]]></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>
<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-anonymous-classes/" rel="bookmark">Java, anonymous classes (classi anonime)</a><!-- (18.7)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-non-static-member-class/" rel="bookmark">Java, non-static member class</a><!-- (14.8)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-local-classes/" rel="bookmark">Java, local classes</a><!-- (13.9)--></li>
	            </ol>
    </div>]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/programmazione/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/programmazione/2009/12/java-lereditarieta-e-i-reference/</link>
		<comments>http://www.alessandrostella.it/programmazione/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[programmazione]]></category>
		<category><![CDATA[ereditarietà]]></category>
		<category><![CDATA[Java]]></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 [...]<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-local-classes/" rel="bookmark">Java, local classes</a><!-- (6.4)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-non-static-member-class/" rel="bookmark">Java, non-static member class</a><!-- (5.8)--></li>
	    	    <li><a href="http://www.alessandrostella.it/guide-e-manuali/2010/06/jquery4j-gestire-jquery-da-java/" rel="bookmark">jQuery4j: gestire jQuery da java</a><!-- (5.4)--></li>
	            </ol>
    </div>]]></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>
<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-local-classes/" rel="bookmark">Java, local classes</a><!-- (6.4)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-non-static-member-class/" rel="bookmark">Java, non-static member class</a><!-- (5.8)--></li>
	    	    <li><a href="http://www.alessandrostella.it/guide-e-manuali/2010/06/jquery4j-gestire-jquery-da-java/" rel="bookmark">jQuery4j: gestire jQuery da java</a><!-- (5.4)--></li>
	            </ol>
    </div>]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/programmazione/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/programmazione/2009/11/java-e-le-asserzioni/</link>
		<comments>http://www.alessandrostella.it/programmazione/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[programmazione]]></category>
		<category><![CDATA[assert]]></category>
		<category><![CDATA[assertion]]></category>
		<category><![CDATA[asserzioni]]></category>
		<category><![CDATA[Java]]></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 [...]<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-anonymous-classes/" rel="bookmark">Java, anonymous classes (classi anonime)</a><!-- (11.2)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/02/java-1-6-nested-type-e-inner-classes/" rel="bookmark">Java 1.6, nested type e inner classes</a><!-- (8.4)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-ciclo-di-vita-degli-oggetti-garbage-collection/" rel="bookmark">Java, ciclo di vita degli oggetti e garbage collection</a><!-- (8)--></li>
	            </ol>
    </div>]]></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>
<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-anonymous-classes/" rel="bookmark">Java, anonymous classes (classi anonime)</a><!-- (11.2)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/02/java-1-6-nested-type-e-inner-classes/" rel="bookmark">Java 1.6, nested type e inner classes</a><!-- (8.4)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-ciclo-di-vita-degli-oggetti-garbage-collection/" rel="bookmark">Java, ciclo di vita degli oggetti e garbage collection</a><!-- (8)--></li>
	            </ol>
    </div>]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/programmazione/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/programmazione/2009/11/java-e-il-passaggio-di-parametri/</link>
		<comments>http://www.alessandrostella.it/programmazione/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[programmazione]]></category>
		<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 [...]<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/11/java-e-i-dati-primitivi-e-la-ram/" rel="bookmark">Java, i dati primitivi e la RAM</a><!-- (17.2)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/10/java-i-reference-e-la-programmazione-a-oggetti/" rel="bookmark">Java, i reference e la RAM</a><!-- (13.2)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-ciclo-di-vita-degli-oggetti-garbage-collection/" rel="bookmark">Java, ciclo di vita degli oggetti e garbage collection</a><!-- (12.8)--></li>
	            </ol>
    </div>]]></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>
<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/11/java-e-i-dati-primitivi-e-la-ram/" rel="bookmark">Java, i dati primitivi e la RAM</a><!-- (17.2)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/10/java-i-reference-e-la-programmazione-a-oggetti/" rel="bookmark">Java, i reference e la RAM</a><!-- (13.2)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-ciclo-di-vita-degli-oggetti-garbage-collection/" rel="bookmark">Java, ciclo di vita degli oggetti e garbage collection</a><!-- (12.8)--></li>
	            </ol>
    </div>]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/programmazione/2009/11/java-e-il-passaggio-di-parametri/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Java, i dati primitivi e la RAM</title>
		<link>http://www.alessandrostella.it/programmazione/2009/11/java-e-i-dati-primitivi-e-la-ram/</link>
		<comments>http://www.alessandrostella.it/programmazione/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[programmazione]]></category>
		<category><![CDATA[dati primitivi]]></category>
		<category><![CDATA[Java]]></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 [...]<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/10/java-i-reference-e-la-programmazione-a-oggetti/" rel="bookmark">Java, i reference e la RAM</a><!-- (18.3)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/11/java-e-il-passaggio-di-parametri/" rel="bookmark">Java e il passaggio di parametri</a><!-- (13.9)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-ciclo-di-vita-degli-oggetti-garbage-collection/" rel="bookmark">Java, ciclo di vita degli oggetti e garbage collection</a><!-- (9.7)--></li>
	            </ol>
    </div>]]></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>
<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/10/java-i-reference-e-la-programmazione-a-oggetti/" rel="bookmark">Java, i reference e la RAM</a><!-- (18.3)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/11/java-e-il-passaggio-di-parametri/" rel="bookmark">Java e il passaggio di parametri</a><!-- (13.9)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2010/04/java-ciclo-di-vita-degli-oggetti-garbage-collection/" rel="bookmark">Java, ciclo di vita degli oggetti e garbage collection</a><!-- (9.7)--></li>
	            </ol>
    </div>]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/programmazione/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/programmazione/2009/10/java-i-reference-e-la-programmazione-a-oggetti/</link>
		<comments>http://www.alessandrostella.it/programmazione/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[programmazione]]></category>
		<category><![CDATA[Java]]></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 [...]<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/11/java-e-i-dati-primitivi-e-la-ram/" rel="bookmark">Java, i dati primitivi e la RAM</a><!-- (23.7)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/12/java-lereditarieta-e-i-reference/" rel="bookmark">Java, l&#8217;ereditarietà e i reference</a><!-- (17.5)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/11/java-e-il-passaggio-di-parametri/" rel="bookmark">Java e il passaggio di parametri</a><!-- (15.7)--></li>
	            </ol>
    </div>]]></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>
<div id="artCorr">
            <h4>Articoli correlati</h4>
        <ol>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/11/java-e-i-dati-primitivi-e-la-ram/" rel="bookmark">Java, i dati primitivi e la RAM</a><!-- (23.7)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/12/java-lereditarieta-e-i-reference/" rel="bookmark">Java, l&#8217;ereditarietà e i reference</a><!-- (17.5)--></li>
	    	    <li><a href="http://www.alessandrostella.it/programmazione/2009/11/java-e-il-passaggio-di-parametri/" rel="bookmark">Java e il passaggio di parametri</a><!-- (15.7)--></li>
	            </ol>
    </div>]]></content:encoded>
			<wfw:commentRss>http://www.alessandrostella.it/programmazione/2009/10/java-i-reference-e-la-programmazione-a-oggetti/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

