Newsgroup: it.comp.java
Titolo: Puntatori in Java





Già da quando frequentavo l'università java era 
famoso non tanto per l'obbligo della OOP (Object Oriented Programming) ma per la 
totale assenza dei puntatori. Ora io mi devo occupare di Java, e non avendolo 
trattato come argomento universitario, mi ritrovo con qualche Bug anche se ho 
una modesta esperienza in fatto di programmazione. Il problema è questo. Se devo 
organizzare una struttura dinamica ad albelo, come faccio senza l'utilizzo 
dei puntatori?



faccio senza l'utilizzo dei puntatori?
il fatto che java non abbia i puntatori e' un falso mito :)
java non ha l'aritmetica dei puntatori (si dice cosi'?)
ad esempio 
Oggetto o = new Oggetto();
o altro non e' che un puntatore (che pero' nessuno chiama puntatore)
quindi se devi realizzare un albero puoi farlo esattamente come in C
public class nodo
{
	private nodo l;
	private nodo r;
	...
	public nodo(...)
	{
		...
	}
}
ciao_O
http://digilander.iol.it/schiele
http://jame.sourceforge.net

>faccio senza l'utilizzo dei puntatori?
esiste l'apposita struttura JTree
-------------------
ara...@lohobbitelatorre.org

esiste l'apposita struttura JTree
Non scherziamo per favore... JTree e' una struttura di Swing che si
usa per esempio per gli alberi delle cartelle e dei file.. per
rappresentarli graficamente !!! In altre aporole usi JTree per fare
interfacce simili a quelle del File Manager o di Esplora Risorse.. non
c'entra nulla invece con la struttura dati Albero (binario, n-ario ,
AVL o quello che ti pare) che e' tutt'altra cosa !!!
Augusto Pucci ( 
http://www.prospektiva.it/webmaster/
 )
Webmaster di Prospektiva On-line
http://www.prospektiva.it
Webmaster di SIPO Toscana
http://sipotoscana.supereva.it

rappresentarli graficamente !!! 
Mi è capitato di usare le classi del package javax.swing.tree anche per altri 
scopi senza avvalermi dell'interfaccia grafica: mi sono trovato bene e le 
classi sono abbastanza complete e semplici da usare. 
In ogni caso anche senza i puntatori è possibile creare alberi binari e n-ari.
Semplicemente si avranno "oggetti Nodi", invece che un'insieme di puntatori.
In fondo quando si passa un Oggetto ad una funzione è un po' come (non uccidetemi)
se si passasse un puntatore a quell'oggetto solo che lo fa la JVM al tuo posto! ;)
Vi prego, non assalitemi e prendete tutto ciò come un delirio post-malattia...
See: 
javax.swing.tree.DefaultMutableTreeNode
... di cui segnalo, utilissimi, i metodi:
postorderEnumeration() 
preorderEnumeration() 
[link]
http://java.sun.com/docs/books/tutorial/uiswing/components/tree.html
Bye

 o altro non e' che un puntatore (che pero' nessuno chiama puntatore)
Errore carissimo.
E' un riferimento. C'e' una sottile differenza semantica tra riferimento e 
puntatore.

> java non ha l'aritmetica dei puntatori (si dice cosi'?)
X> Errore carissimo.
Mica tanto. Nei corsi sun te lo dicono chiaro e tondo che i riferiment
non son altr che puntator (intoccabili) sotto mentite spoglie.
X> E' un riferimento. C'e' una sottile differenza semantica tra riferimento e 
X> puntatore.
La differenza è che nell'uso, non nella semantica: accedi ad oggetto e
non ad oggetto  puntato da ma solo perché c'è  sotto un meccanismo per
mascherare   la   cosa.   Semanticamente   hai   un'area  di   memoria
(corrispondente  alla variabile  dichiarata) che  contiene l'indirizzo
nello heap dell'oggetto cui fai riferimento. Non è una cosa nuova, c'è
(ma  non  si  chiamavano  riferimenti)  già nel  primo  linguaggio  di
programmazione bello (LISP). Nei linguaggi procedurali riferimenti tra
l'altro esistono dal  Pascal (come tipo di passaggio  per parametri) e
si tratta  sempre di  indirizzi ad aree  di memoria (nel  pascal messi
sullo stack per la chiamata a procedura/funzione).
Teoricamente è  possibile fare i  riferimenti senza i  puntatori (vedi
gli handle di Windows) ma non sono così efficenti.
--
Gian Uberto| main(){printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
Lauri      |                        David Korn, 1987 ioccc best one liner 
(aka saint)|-------------------------------------------------------------------
em@ail: 
sa...@eng.it
 ( vedere X-nospam nello header - see X-nospam in header )

 gli handle di Windows) ma non sono così efficenti.
Bravo! Ti stai avvicinando alla soluzione. Un handle e' un esempio di un 
riferimento ad un oggetto (facciamo un esempio banale l'handle di un file 
che nel vecchio C veniva ritornato dalla open) non e' un puntatore.
O forse credevi che ti davano l'accesso alle strutture interne del sistema 
operativo che manco puoi indirizzare? Dai che ci siamo alla soluzione.
Allora un riferimento puo' potenzialmente dare un grado di protezione 
all'oggetto riferito molto maggiore che un puntatore il quale punta allo 
spazio di indirizzi del processo e non puo' quindi dare.  E' un discorso 
che vale per tutti i linguaggi, il senso delle due parole, non dirmi che in 
questo o quel linguaggio hanno mischiato le cose per cui si assomigliano, 
non me ne frega nulla
In sostanza il riferimento ha un livello di astrazione rispetto alla 
memoria fisica che il puntatore non ha. Qui sta la differenza nella 
semantica del linguaggio che non avevi afferrato. Poi ciascuno puo non 
capire la differenza e sbagliare i nomi, basta riflettere.
Non capisco perche' teoricamente poi. Vuoi dire che quando apro un socket o 
un file faccio una operazione teorica? A me sembrano azioni molto pratiche.
Non trovo poi cosi' ineffcienti le operazioni sui socket e files. certo se 
potessi quando voglio sapere la posizione corrente nel file leggere le 
strutture interne e leggere i 4 bytes direttamente nel S:O. sarebbe una 
scheggia.
Prova....
.

 Sono loro che sono incompetenti sotto mentite spoglie.
oh... senza offesa... ma lo sai che sei un rompiballe di dimensioni
galattiche? E nelle spoglie di un rompiballe? ;) Ho dato una rapida
scorsa ai msg che hai mandato finora: avrai si e no "aiutato" un paio di
persone e mandate a cagare almeno un centinaio con qualche cavillo più o
meno giustificato.
Se non cambi atteggiamento, avrai vita molto breve sul ng, che è una
comunità di persone con gli stessi interessi e che vive talvolta delle
differenze di competenze, talvolta dell'opposto. Non si entra in una
comunità strillando "siete tutti scarsi, io sono il piu' bravo e
ascoltate me", non si arriva da nessuna parte e non giova a nessuno. Se
hai le competenze, aiuta chi ne ha di meno. Quelle che non hai, cerca di
impararle anche (non solo, ovvio) dai msg di chi è più esperto di te (ce
ne sono parecchi che postano, più o meno frequentemente, qui sul ng,
compresi alcuni di quelli che hai maldestramente "bacchettato").
Nessuno sa tutto, probabilmente neanche te: se domani postassi qualche
quesito qui sul ng credi che qualcuno ti risponderebbe?
ciao
-- 
          ______
         /_____/\             Ugo Landini
        /____ \\ \            Supervisor degli incompetenti
       /_____\ \\ /           Sun Educational Services
      /_____/ \/ / /
     /_____/ /   \//\         SUN Microsystems Italia S.p.A.
     \_____\//\   / /         Via Romagnosi, 4
      \_____/ / /\ /          00196 - Rome (RM) - Italy
       \_____/ \\ \           @mail : 
ugo.l...@sun.com
        \_____\ \\            Phone : +39 (0)  6 36708.682
         \_____\/             GSM   : +39 (0)  335 7766651

 quesito qui sul ng credi che qualcuno ti risponderebbe?
Nessun problema a smettere totalmente di postare, visto che non server 
allora.

 allora.
E perchè? Non puoi invece semplicemente essere più educato ed usare le
tue conoscenze per uno scopo un po' più nobile che offendere gli altri?
Penso proprio di rappresentare il pensiero di tanti dicendoti che i tuoi
commenti sarebbero ben accetti se posti in altro modo e con altro scopo.
Nessuno qui sta seduto alla finestra a tirare sassi in testa a chi
sbaglia o a sfoggiare conoscenze, anche se talvolta certi post sono
"irresistibili". Se pensi che il livello del ng è basso, cerca di
alzarlo! Proponi thread utili, nei limiti del tempo che il lavoro ti
lascia, e lascia magari le risposte più banali a chi comincia ad essere
"esperto".
Ci aspettiamo da te un thread "costruttivo" al più presto. Magari un
altro esempio di rifattorizzazione come fu fatto qualche settimana fa,
oppure metriche di accoppiamento e coesione, oppure quello che vuoi e
che ti piace: potresti trovare qualcuno intererssato a scambiare
opinioni,e, chissà, imparare anche qualcosa (o magari no: però ti sarai
fatto qualche amico)
salutoni e non fuggire.
-- 
          ______
         /_____/\             Ugo Landini
        /____ \\ \            Education Technical Supervisor


> sullo stack per la chiamata a procedura/funzione).
X> Un riferimento ha un livello di astrazione diverso.
Niet Tovarich!   In Pascal hanno  il medesimo livello di  astrazione e
potrebbero  benissimo  essere  implementati  con un  altro  meccanismo
diverso dall'indirizzo in memoria. In C è diverso, in C un puntatore è
un  indirizzo di  memoria. Lo  stesso  potresti essere  così pazzo  da
costruire un meccanismo che astrae  dalla memoria fisica e permette di
fare l'aritmetica. Più o meno quello che ti fa una MMU...
X> Tuttavia puo' essere 
X> implementato in linguaggi poco sofisticati con un puntatore, ma il fatto 
X> che uno scelga di implementare un riferimento con un puntatore non dice che 
X> siano sinonimi.
L'uso degli indirizzi fisici  non è sinonimo di scarsa sofisticazione.
Pascal  li usa  per efficenza,  Wirth aveva  bisogno di  un linguaggio
semplice  che consumasse  meno cicli  macchina possibile  (i  costi di
esercizio  di  un CDC6600  erano  decisamente  alti)  e quindi  meglio
risparmiare cicli macchina.
Forse il risparmio  di cicli macchina per te è  un concetto strano, ma
al MIT ti garantisco che ci vanno ancora dietro.
X> Non capisco perche' teoricamente poi. Vuoi dire che quando apro un socket o 
X> un file faccio una operazione teorica? A me sembrano azioni molto pratiche.
X> Non trovo poi cosi' ineffcienti le operazioni sui socket e files.
Andiamo a studiarci un po' i sistemi operativi prima di mischiare mele
e patate. I descrittori di sistema  per i file non sono nel tuo spazio
di indirizzamento, non potresti arrivarci con un puntatore...


java non ha l'aritmetica dei puntatori (si dice cosi'?)
Si dice cosi'. :-)
-- 
God is Real, unless declared Integer.
ObjectZone - 
http://space.tin.it/computer/csadun

 
ok per la vacanza... ma l'utilita' dove la mettiamo? (Ugo aziendalista
;))
-- 
UL

Ciao grazie per la risposta ma potevi fare a meno di replicare, essendo 
considerato da qualcuno un rompiballe di 'dimensioni galattiche' (che 
onore), avendo ricevuto la profezia o minaccia di 'vita breve nei 
newsgroup' (cos'e' l'olio di ricino virtuale?) e successivamente di 
'persona che deve essere piu' educata' (chissa' se ci sono corsi SUN anche 
per questo?), che 'sfoggia la sua conoscenza'  e poi che 'tira i sassi 
sulla testa della gente' (dovrei essere arrestato come quelli che lo fanno 
dal cavacavia?). Bel ritratto, moderato e gentile, scritto certamente da un 
fine e raffinato piscologo. 
Ritengo tuttavia superfluo rispondere precisarando i miei post precedenti o 
commentando le tue posizioni. Cosi' qualcuno non sara' infastidito da 
ulteriori sfoggi.
Bye

 writes:
X> onore), avendo ricevuto la profezia o minaccia di 'vita breve nei 
X> newsgroup' (cos'e' l'olio di ricino virtuale?)
Era per me la vita breve ?
