Newsgroup: it.comp.java
Titolo: Object o NON Object this ....

 Grazie
Infatti!!!!
con a==b confronti i riferimenti alla memoria!!! (handle), che
chiaramente non sono uguali!
Con equals confronti il contenuto della stringa!!!

Le String di java sono Object (o almeno così recita la documentazione)
e dice anche che è equivalente la dichiarazione:


 Con equals confronti il contenuto della stringa!!!
OOOPsss !!! Avevo risposto troppo in fretta!!! Qui dove faccio il
servizio vcivile c'e' casino a volte:)
Credo  (se sbaglio correggetemi!!)che si tratti del fatto che usi "mela"
nelle due stringhe e il compilatore si accorga di cio' ottimizzando!!!

 Grazie
Object. Anche se stiamo parlando di classi, dunque si dovrebbe dire
Class.
Prova a dare un'occhiata ai miei test su Java su
http://www.ugolandini.net
(mi sembra quello intermedio) e c'è una risposta, seppur breve.
Comunque il succo è che l'implementazione di String utilizza la tecnica
del reference count, dunque una stessa stringa (se non hai esplicitato
la
creazione di un NUOVO oggetto con il new()) può essere realmente
condivisa
da più handles. Tutto ciò avviene in maniera trasparente, risparmia
memoria e non è per nulla strano se pensi che le stringhe sono
immutabili,
cioè non possono essere modificate in alcuna maniera (Immutable Pattern)
da nessun metodo di nessuna classe (i metodi che apparentemente lo fanno
restituiscono in realtà sempre una nuova stringa) .
Due "spunti" sull'argomento, che potrebbero generare thread interessanti
per gli amanti di Java, uno un po' più difficile, l'altro forse più
"filosofico":
- A chi viene in mente un esempio in cui questo comportamento possa
portare a problemi nell'implementazione di un algoritmo, oppure una
dimostrazione che ciò non possa mai avvenire? (ovviamente non l'esempio
di
cui sopra o quello molto simile del mio test che non hanno alcun
utilizzo
pratico)
- e invece l'array ([])? E' una classe? Che particolarità ha? Come può
essere istanziato? Si può parlare di overloading di costruttori o cosa?
E
di overloading di operatori? E perchè esiste un solo attributo, length,
invece di un metodo, length(), come da standard OO?
Ciao
--
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
Enterprise Java Consulting
@mail: Ugo.L...@Flashnet.it
Home URL: 
http://www.ugolandini.net
Mentoring URL: 
http://www.projectoo.com
Sample Work: 
http://www.sirena.lomb.cgil.it
Work Phone: 02/61860644-6-7
Cell Phone: 0347/6310749 - 0347/4783580
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

Object o NON Object ???
Nulla di strano: succede esattamente quel che deve succedere.
Le due stringhe sono due *diversi* oggetti (di classe) String che incapsulano 
la stessa sequenza di caratteri. 
Quindi == (che confronta i reference degli oggetti, verificando se puntano allo 
stesso) ritorna false, mentre equals (che confronta la stringa di caratteri 
contenuta) ritorna true.
-- 
God is Real, unless declared Integer.
ObjectZone - 
http://space.tin.it/computer/csadun

 contenuta) ritorna true.
Attento alle righe commentate!!!
-- 
Ugo
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
Enterprise Java Consulting
@mail: Ugo.L...@Flashnet.it
Home URL: 
http://www.ugolandini.net
Mentoring: 
http://www.projectoo.com
Sample Work: 
http://www.sirena.lomb.cgil.it
Work Phone: 02/61860647-6-4
Cell Phone: 0347/6310749 - 0347/4783580
Fax Phone: 02/700 413 187
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

Attento alle righe commentate!!!
Hai ragione, non avevo letto bene. ;-)
-- 
God is Real, unless declared Integer.
ObjectZone - 
http://space.tin.it/computer/csadun/


Potete smettere per favore di intasarmi la casella postale con tutte 'ste
risposte??? ;)
Ugo
__________________________________________________________________________
"La perfezione si ottiene non quando non c'è nient'altro da aggiungere,
 bensì quando non c'è più niente da togliere." Antoine de Saint-Exupéry
__________________________________________________________________________
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Enterprise Java Consulting
@mail: Ugo.L...@Flashnet.it
Home Page: 
http://www.ugolandini.net
Mentoring: 
http://www.projectoo.com
Work Phone: 02/61860647-6-4 06/58332267
Cell Phone: 0347/6310749 - 0347/4783580
Fax Phone: 02/700 413 187
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

 risposte??? ;)
Eheh! :)) Io non mi stupisco tanto dell'"intasamento", come dici tu. Se devo
essere sincero, anch'io non sono sicuro di capire il senso delle domande.
Io provo a rispondere, ma credo che sarebbe una buona idea se dessi anche tu
le tue risposte, così si capisce anche meglio cosa intendi.
1) Come tu stesso fai osservare, se le stringhe non possono mai essere
modificate, la condivisione di spazi di memoria non dovrebbe portare ad
errori. L'unica situazione "a rischio" potrebbe essere quella in cui
qualcosa venga fatto dipendere dall'identità di due stringhe (operatore ==)
e in cui il programmatore ignori il fatto che le stringhe usano il reference
counting.
Ma, francamente, non riesco a immaginare un caso in cui una cosa del genere
abbia veramente senso. Il confronto degli indirizzi, se non è un errore,
cioè se non è usato al posto di equals(), può aver senso, ad esempio, per
implementare una ottimizzazione sul tipo di quella già esistente, anche per
le stringhe create con new; ma in questo caso si troverebbe che certe
stringhe fanno già riferimento allo stesso indirizzo e non si effettuerebbe
l'ottimizzazione (oppure si riassegnerebbe lo stesso indirizzo). Altre cose
che
ragionevolmente possano dipendere dall'indirizzo delle stringhe, considerata
la presenza della garbage collection, non mi vengono proprio in mente.
Potrei invece fare esempi di codice strampalato che può generare un errore
in un caso del genere:
- se si confronta l'indirizzo di due argomenti di tipo stringa di un metodo,
perchè si sa che in certe circostanze la funzione chiamante assegna lo
stesso oggetto stringa ad ambedue gli argomenti
- se si confronta l'indirizzo di una variabile membro di tipo stringa
(eventualmente restituita da un metodo) per un insieme di oggetti, con
quello di una stringa data precedentemente al costruttore di uno di quegli
oggetti, per ritrovare un determinato oggetto.
Più in generale, possono rappresentare situazioni a rischio tutte quelle in
cui si usano mezzi contorti, poco espliciti, logicamente deboli, fortemente
dipendenti da una specifica implementazione, per identificare degli oggetti.
2) Un array in Java è un oggetto particolare. E` un Object, eredita i metodi
di Object, ma non rispetta le regole sintattiche di un oggetto. E` insomma
esso stesso un elemento sintattico a sè, con regole tutte sue, per cui non
appare incoerente l'uso di length come field pubblico anzichè come metodo,
ma non lo sarebbe stato neppure l'uso del metodo. Si potrebbe dire che l'uso
del field sottolinea la particolarità dell'oggetto array, mentre l'uso del
metodo avrebbe enfatizzato la sua affinità con i normali oggetti.
Non direi che si possa parlare di overloading di costruttori, per il fatto
che non esistono costruttori per gli arrays. E neppure di overloading di
operatori perchè questo è un elemento sintattico del C++ che non esiste in
Java. Tutt'al più si può dire che l'array Java ricorda, o ha affinità con,
una classe C++ che usi l'overloading dell'operatore [], ma in effetti ha
altrettanta affinità con un normale array C++.