Newsgroup: it.comp.java
Titolo: Alberi e Liste Concatenate

Seguendo le risposte a threads precedenti, ho colto il fatto che,
sebbene nelle specifiche di implementazione di Java non esistano
piu' i puntatori, di fatto e' possibile passare un array od un
oggetto ad un metodo e da questo ottenere modificato l'array o
l'oggetto restituito, esattamente come si fa in C quando si passa
un pointer.
A questo punto, mi domandavo come sia possibile in Java, se lo e',
implementare alberi e liste concatenate, cioe' tipiche strutture
che non riesco ad immaginare senza la presenza di puntatori.
C'e' qualcuno che sa rispondermi sul fatto che esista un
escamotage, come il passaggio parametri per "reference" ad una
funzione passando l'oggetto intero e non i suoi valori, per
riuscire ad implementare queste strutture di dati (alberi e liste)
in Java ?
Grazie.
--
Massimo Zampato

 in Java ?
Facciamo un po' di chiarezza:
Innanzitutto gli oggetti sono tutti creati sullo heap dinamicamente , e
non  c'è la  possibilità di crearli nella memoria "statica" come in c++.
Tutte le applicazioni "serie" OO devono usare l'allocazione dinamica,
dunque questa non è una vera e propra mancanza, anzi forse costringe a
pensare un po' di più in termini OO.
Passare un parametro non di tipo scalare in Java corrisponde al
passaggio di un puntatore (handle), di cui il metodo crea localmente una
copia (ma punta sempre alla stessa zona di memoria: in questo caso si
parla di aliasing: due handle sono "alias", cioè equivalenti). Quindi il
passaggio di parametri complessi è sempre per "valore di un reference",
ed è difficile stabilire la terminologia : per valore o per reference?
Java passa tutto per valore, ma il valore di un oggetto è solo un
handle, dunque il passaggio è per reference!
La conclusione è: se si passano i tipi scalari, è il classico passaggio
per valore. Se si passano i tipi complessi, il passaggio avviene per
reference (a livello funzionale), che si traduce tecnicamente  in un
passaggio per valore di un handle. Se si vuole ottenere un passaggio per
"valore valore" di un oggetto, bisogna crearne una copia, di solito con
il metodo clone(), e passare un handle di quella copia (quindi ancora
sempre per reference, ma per "valore" a livello funzionale).
Se poi l'oggetto contiene come attributi altri oggetti, (che abbiamo
visto in realtà essere handle) la faccenda si complica, perchè il metodo
clone() di per sè effettua una "shallow copy" e non una "deep copy",
copia cioè fisicamente solo la zona di memoria che rappresenta il nostro
oggetto, ma non le zone di memoria a cui questo oggetto punta attraverso
i suoi handle, e dunque si ritorna ad un caso di aliasing. A complicare
le cose, non è detto che tutti gli oggetti siano clonabili (devono
implementare l'interfaccia Cloneable + qualche altra cosetta), e dunque
il comportamento di default ("shallow copy") è corretto.
Immagina cosa succederebbe clonando un Vector se clone() facesse un deep
copy e alcuni degli oggetti contenuti nel Vector non fossero clonabili.
Implementare una deep copy necessita di qualche accorgimento nella
definizione degli oggetti (devono ovviamente essere tuti clonabili) e
fare in modo che venga chiamato il clone() a cascata in tutti gli
oggetti contenuti (che a loro volta possono contenere altri handle, e
così via)
A conclusione di ciò, una provocazione: che differenza c'è fra un handle
ed un puntatore? Nessuna!
Java sembra voler "nascondere" l'esistenza dei puntatori per facilitare
la programmazione (o per motivi pubblicitari?), ma qualche volta questo
può portare a fraintendimenti e a maggiori complicazioni. E' sicuramente
giusto togliere l'aritmetica dei puntatori ed inserire il Garbage
collector, ma perchè però non chiamare le cose con il loro nome? Si
chiamano PUNTATORI, alias handle, e non potrebbe essere altrimenti:
pensa a come passare un ResultSet di una query su un DB da un metodo
all'altro per valore...
E, visto che ci sono, aggiungerei anche che Java è si un C++
semplificato (e sotto certi aspetti potenziato), ma non di molto: Java è
un linguaggio complesso, MOLTO più complesso di qualsiasi Visual Cagata,
quindi bisogna assolutamente studiare la teoria OO insieme al
linguaggio, altrimenti...
Ugo

Devi dare Fondamenti di Informatica? :-))
Seriamente si può fare eccome, se hai voglia di investire un po' di
spicci guarda questo libro:
Data structures and algorithms in Java
Michael Goodrich, Roberto Tamassia
Wiley
E' in inglese, ma ha tutti i listati che cerchi
Ciao

 Massimo Zampato
class ListString
{
public ListString(String val)
    {value=val;
     next=null;}
public ListString(String val,ListString list)
   {value=val;
    next=list;}
public ListString append (String val,ListString list)
      {ListString zz=new ListString(val);
      if (list!=null)
       {zz.next=list.next;
        list.next=zz;
        }
       return zz;
       }
String value;
ListString next;
}
questa e' una classe che costruisce una lista di stringhe..........quasi
come in c.