Torna indietro   Hardware Upgrade Forum > Software > Programmazione

ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità
ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità
NUC 15 Pro e NUC 15 Pro+ sono i due nuovi mini-PC di casa ASUS pensati per uffici e piccole medie imprese. Compatti, potenti e pieni di porte per la massima flessibilità, le due proposte rispondono in pieno alle esigenze attuali e future grazie a una CPU con grafica integrata, accompagnata da una NPU per la gestione di alcuni compiti AI in locale.
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Dal palco di Proofpoint Protect 2025 emerge la strategia per estendere la protezione dagli utenti agli agenti IA con il lancio di Satori Agents, nuove soluzioni di governance dei dati e partnership rafforzate che ridisegnano il panorama della cybersecurity
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Dopo alcuni anni di assenza dai cataloghi dei suoi televisori, Hisense riporta sul mercato una proposta OLED che punta tutto sul rapporto qualità prezzo. Hisense 55A85N è un televisore completo e versatile che riesce a convincere anche senza raggiungere le vette di televisori di altra fascia (e altro prezzo)
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-01-2008, 02:00   #81
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7257
Quote:
Originariamente inviato da mad_hhatter Guarda i messaggi
tu continui a farmi esempi reali... ho capito che in java il passaggio per riferimento non esiste, mentre in c++ si. non e' questo il punto!
no?
Quote:
Originariamente inviato da mad_hhatter Guarda i messaggi
io parlo soltanto a livello di astrazione mentale, nulla di cio' che descrivo avviene realmente, e' solo un modo di immaginare, di SEMPLIFICARE, quello che avviene.

possibile che non mi sia ancora spiegato su questo punto?
ma qui non si tratta di semplificare.. al contrario si sta complicando una questione ultrasemplice.
voi dite:
in java i tipi primitivi sono passati per valore mentre gli oggetti sono passati per riferimento (beh ad eccezione degli oggetti immutabili ecc..)

mentre in realtà:
in java tutto viene passato per valore

quale ti sembra più semplice?
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 02:06   #82
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da k0nt3 Guarda i messaggi
no il pezzo che hai quotato prima dal link parla di L-value di una variabile (il parametro), non di un oggetto.
l'L-value è l'indirizzo di memoria della variabile, mentre il reference è il contenuto di una variabile di tipo reference che a sua volta può essere interpretato come L-value di un oggetto. ma considerando che in java le variabili non contengono MAI oggetti allora si può dedurre che il reference non sarà MAI l'L-value di nessuna variabile, ne tantomeno di un parametro. motivo per cui quello che hai quotato dal link è esatto e non porta alle conclusioni a cui sei arrivato.


già il fatto che immagini di passare l'oggetto è sbagliato in sè, ma anche ammettendo di poterlo immaginare crei fraintendimenti perchè il concetto di passaggio per riferimento è un concetto generale che non si applica solo a java, ma ai linguaggi in generale (la definizione mica l'ho inventata io). se tu mi dici che in java gli oggetti vengono passati per riferimento allora io potrei scrivere una cosa come quella che ho appena scritto in C++ e pretendere che funzioni, invece non funziona.
e invece no, perche' se ti dico che sto usando una semplificazione e un abuso di linguaggio (e l'ho detto quasi in ogni post di questo thread) non puoi venirmi a dire che rischio che qualcuno pretenda di applicare una cosa che ho espressamente dichiarato non esistere.
e in ogni caso se uno programma in java e pretende che un reference SIA un oggetto non so cosa farci
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 02:10   #83
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da mad_hhatter Guarda i messaggi
indirizzo, riferimento... mi spieghi la differenza?
perdonami, ma cos'e' un reference se non un L-value di un particolare oggetto?

possibile che non sia ancora chiaro che non sto parlando di come funziona java, ma sto solo rappresentando il passaggio di parametri (nel solo caso in cui essi siano reference type) "immaginando che" il parametro passato sia l'oggetto e non il suo riferimento (chissa' perche' parliamo di riferimento di un oggetto e io non posso usare il termine passaggio per riferimento visto che, anche tecnicamente, cio' che viene passato e' proprio il riferimento all'oggetto, sia pure soltanto per copia...). E' un modo colloquiale di parlare, se vuoi, o di ragionare in termini spiccioli... ancora, e' un modo per identificare il fatto che l'oggetto non e' passato per copia e, visto che di fatto in java non esiste il passaggio per riferimento, parlando di passaggio per riferimento non introduco ambiguita' o possibilita' di fraintendimenti.
allora..
prima di uscire avevo scritto un post piuttosto esplicativo..
ma dato cheu nsimpatico fulmine ha deciso di far andare via la corrente e quel genio di mio fratello ha distrutto il gruppo di continuità si è perso tutto.
Riassumendo in breve :
non esite il termine "concettualmente" o "immaginando che".
Le specifiche del linguaggio java sono ben chiare in proposito.
una variabile, o un l-value se ti piace di + NON è un oggetto.
E' il riferimento di un oggetto, che è cosa ben diversa.
Quando tu passi un parametro ad un metodo passi per copia il suo riferimento.
E tutto ciò è assolutamente lineare ed auto-esplicativo ed elimina ogni possibilità di errore.
Quando tu dici che in java esiste il passaggio per copia dei primitivi e per riferimento dei reference type stai affermando qualcosa che è contrario alle specifiche del linguaggio.
Infatti in java non è mai ammesso il passaggio per riferimento, ma avviene SEMPRE il passaggio per valore.
Quindi il tutto è perfettamente semplice e lineare analizzato in quest'ottica.
Per i primitive type il passaggio per valore implica il passaggio per copia del valore della variabile, nel caso dei reference type avviene sempre il passaggio per copia del valore del riferimento (che è il contenuto della variabile).
Quindi non vedo perchè complicarsi la vita introducento un passaggio per riferimento "fittizio" che non è un vero passaggio per riferimento e che semplicemente, a quanto ci dicono le specifiche del linguaggio, non ha modo di essere e che, in alcuni casi, potrebbe indurre in errore.
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 02:12   #84
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da k0nt3 Guarda i messaggi
no?

ma qui non si tratta di semplificare.. al contrario si sta complicando una questione ultrasemplice.
voi dite:
in java i tipi primitivi sono passati per valore mentre gli oggetti sono passati per riferimento (beh ad eccezione degli oggetti immutabili ecc..)

mentre in realtà:
in java tutto viene passato per valore

quale ti sembra più semplice?
quotissimo.
Oltre ad essere una complicazione perchè introduce una disomogeneità nel modo (perfettamente omogeneo) con cui sono trattati i parametri in java, in realtà è anche sbagliato perchè in alcuni casi può portare a errori (come nell'esempio della funzione swap).
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 02:14   #85
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7257
Quote:
Originariamente inviato da mad_hhatter Guarda i messaggi
e invece no, perche' se ti dico che sto usando una semplificazione e un abuso di linguaggio (e l'ho detto quasi in ogni post di questo thread) non puoi venirmi a dire che rischio che qualcuno pretenda di applicare una cosa che ho espressamente dichiarato non esistere.
e in ogni caso se uno programma in java e pretende che un reference SIA un oggetto non so cosa farci
ma stiamo parlando di programmazione a livello amatoriale o programazione seria? nel secondo caso si commette un errore grossolano a pensare che le variabili contengono gli oggetti. te lo dico perchè ci sono una marea di errori che possono sorgere da queste convinzioni (e sono anche molto difficili da trovare se non si ha la conoscenza di come vanno le cose in realtà).

ma se tu mi dici che non stiamo parlando della realtà ok, non c'è problema. potrei pensare alle variabili come dromedari che contengono un certo valore di liquido nella gobba e questo valore è il contenuto della variabile. il passaggio dei dromedari avviene prendendo un dromedario nuovo e mettendoci nella gobba lo stesso valore di liquido del dromedario originario. poi basta che scrivo che pretendo che le variabili siano dromedari che è tutto ok
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 02:18   #86
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da k0nt3 Guarda i messaggi
no?

ma qui non si tratta di semplificare.. al contrario si sta complicando una questione ultrasemplice.
voi dite:
in java i tipi primitivi sono passati per valore mentre gli oggetti sono passati per riferimento (beh ad eccezione degli oggetti immutabili ecc..)

mentre in realtà:
in java tutto viene passato per valore

quale ti sembra più semplice?
nessuna delle due.
per un principiante la seconda e' molto ambigua: lo puo' portare a pensare che un oggetto sia passato per valore.

ma il punto e' che io non voglio DIRE che gli oggetti sono passati per riferimento, voglio solo poterlo PENSARE mentre ragiono tra me e me o mentre colloquio con qualcuno che conosce java permettendomi di mantenere impliciti alcuni dettagli NOTI.

poi perche' una String o un array non dovrebbero avere lo stesso trattamento? sono passati per copia? assolutamente no, e' solo che ogni metodo della classe String, ad esempio, che abbia lo scopo di modificare una stringa in realta' ritorna un nuovo oggetto String, cosa che, assieme alla semantica dell'operatore = e al fatto che lavoro con reference e non con oggetti, fa si' che un oggetto String sia immutabile... a me pare straordinariamente semplice
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 02:19   #87
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
quotissimo.
Oltre ad essere una complicazione perchè introduce una disomogeneità nel modo (perfettamente omogeneo) con cui sono trattati i parametri in java, in realtà è anche sbagliato perchè in alcuni casi può portare a errori (come nell'esempio della funzione swap).
e infatti e' modo gergale di ragionare (se mi passi l'espressione) che uso io ma che non userei mai se lo scopo fosse quello di essere rigoroso
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 02:23   #88
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7257
@mad_hhatter
beh senti nessuno ti vieta di pensare come ti pare, ma nel momento in cui ammetti che quello che pensi non corrisponde alla realtà non vedo perchè continuiamo a discuterne
in breve:
esiste il passaggio per riferimento in java? no
posso pensare che esiste comunque? certo, esattamente come puoi pensare che le variabili siano dromedari
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 03:39   #89
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da k0nt3 Guarda i messaggi
@mad_hhatter
beh senti nessuno ti vieta di pensare come ti pare, ma nel momento in cui ammetti che quello che pensi non corrisponde alla realtà non vedo perchè continuiamo a discuterne
in breve:
esiste il passaggio per riferimento in java? no
posso pensare che esiste comunque? certo, esattamente come puoi pensare che le variabili siano dromedari
beh, io immagino che tu, quando pensi a un oggetto, lo concepisci mentalmente pensando alle locazioni di memoria occupate e al loro contenuto binario... e quando chiami un metodo ti raffiguri tutto lo stack frame corrispondente. giusto?

dai, sul serio, queste prese per i fondelli mi fanno sorridere fino a un certo punto.

ho detto e ripetuto che mi ponevo dal punto di vista dell'oggetto: avete continuato a puntualizzare che cio' che viene passato e' un reference. va bene, vorra' dire che poiche' le specifiche di un linguaggio sono quelle e' vietata qualsiasi rappresentazione informale a solo scopo semplificativo. va beh, prendo atto.

concludendo: in java tutto e' passato per valore...

ah no, scusate, non tutto: gli oggetti no, quelli non vengono passati (giustamente, tanto perche' non mi veniate a dire che che sono convinto che accada il contrario).

ma allora non dovreste aver scritto, per precisione: in java _tutti i parametri_ sono passati per valore? ah, era implicito? eh, ma uno potrebe fraintendere...




epilogo
passaggio per riferimento: viene passato l'indirizzo del parametro. punto.

detto questo, in java, volendo capire cosa implica il passaggio di un parametro a un metodo quando il parametro e' un reference type E volendo guardare la cosa dal punto di vista dell'oggetto rappresentato da tale reference, cioe' considerando come parametro l'oggetto piuttosto che il reference, a puro scopo speculativo (analisi lecita, spero, anche se quello che succede veramente coinvolge il reference e non l'oggetto, ma questo e' inessenziale ai fini dell'analisi che sto facendo), ho che al metodo viene passato il reference, cioe' il riferimento, cioe' l'indirizzo dell'oggetto, cioe' l'indirizzo di quella cosa che in questo contesto per me rappresenta il vero parametro (al di la' del fatto che, a rigore, questo sia impreciso).
Toh, guarda... ho descritto, pur in termini puramete concettuali, quello che avviene nel passaggio per riferimento.
Posso allora usare un'espressione colorita e imprecisa a puro scopo di concisione e brevita' discorsiva e dire che "e' come se passassi al metodo l'oggetto per riferimento"?
NO, al massimo mi e' concesso chiamarlo passaggio per indirizzo... che altro non e' se non il riferimento all'oggetto, ma pare che chiamarlo passaggio per riferimento faccia incazzare gli inquilini dell'olimpo.
Insomma, persino quando voglio esplicitamente essere impreciso devo usare delle sottigliezze lessicali... va beh

bon, direi che le cose ce le siamo dette in tutte le salse, siamo ben trincerati nei nostri rispettivi sofismi lessicali pur condividendo che la sostanza, dal punto di vista del linguaggio, e' una sola. ottimo, direi che non c'e' altro da aggiungere, almeno da parte mia.
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 07:07   #90
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da kingmastermind Guarda i messaggi
Scusate se mi intrometto nel forum, ma visto che ho la fortuna di potere chiedere a degli esperti di [Java], volevo sapere secondo la vostra esperienza se in termini di calcolo Moltiplicazioni, divisioni, somme ecc. questo linguaggio, a me sconosciuto, possa essere paragonabile o superiore al [C++] o al [C#]! Vi chiedo questo perchè sono sinceramente interessato al linguaggio ma ho sempre creduto che fosse inferiore in termini di calcolo puro rispetto al [C]! Grazie comunque!
Non capisco come ancora si facciano lotte per stabilire qual è il linguaggio più potente, quando la risposta è a dir poco scontata: il linguaggio macchina.

I veri programmatori, quelli duri e puri, quelli che vogliono il massimo senza alcun compromesso, la loro scelta l'hanno già fatta da tempo. Non ci sono storie: non esiste nulla, ma veramente nulla di più potente del linguaggio macchina.

Ovviamente è gente che ha letteralmente divorato tutti questi http://www.intel.com/products/processor/manuals/ manuali, e in particolare quello sulle ottimizzazioni: Intel® 64 and IA-32 Architectures Optimization Reference Manual. Un MUST: non ci si può definire veri programmatori senza averlo digerito.

Poiché i veri programmatori ottimizzano il codice per qualunque processore esistente, altrettanto ovviamente si saranno divorati anche i manuali di AMD: http://developer.amd.com/documentati...s/default.aspx Anche qui è un MUST questo: Software Optimization Guide for AMD Athlon™ 64 and AMD Opteron™ Processors

Inutile dire che i veri programmatori non usano nemmeno il notepad per generare gli eseguibili. Infatti aprono un prompt dei comandi, scrivono:

copy con mycoolprogram.exe

e digitano il codice di tutti i byte dell'eseguibile, uno dietro l'altro, utilizzando la famigerata combinazione Alt + tastierino numerico.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys

Ultima modifica di cdimauro : 20-01-2008 alle 07:33.
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 09:58   #91
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7257
Quote:
Originariamente inviato da mad_hhatter Guarda i messaggi
beh, io immagino che tu, quando pensi a un oggetto, lo concepisci mentalmente pensando alle locazioni di memoria occupate e al loro contenuto binario... e quando chiami un metodo ti raffiguri tutto lo stack frame corrispondente. giusto?

dai, sul serio, queste prese per i fondelli mi fanno sorridere fino a un certo punto.

ho detto e ripetuto che mi ponevo dal punto di vista dell'oggetto: avete continuato a puntualizzare che cio' che viene passato e' un reference. va bene, vorra' dire che poiche' le specifiche di un linguaggio sono quelle e' vietata qualsiasi rappresentazione informale a solo scopo semplificativo. va beh, prendo atto.

concludendo: in java tutto e' passato per valore...

ah no, scusate, non tutto: gli oggetti no, quelli non vengono passati (giustamente, tanto perche' non mi veniate a dire che che sono convinto che accada il contrario).

ma allora non dovreste aver scritto, per precisione: in java _tutti i parametri_ sono passati per valore? ah, era implicito? eh, ma uno potrebe fraintendere...




epilogo
passaggio per riferimento: viene passato l'indirizzo del parametro. punto.

detto questo, in java, volendo capire cosa implica il passaggio di un parametro a un metodo quando il parametro e' un reference type E volendo guardare la cosa dal punto di vista dell'oggetto rappresentato da tale reference, cioe' considerando come parametro l'oggetto piuttosto che il reference, a puro scopo speculativo (analisi lecita, spero, anche se quello che succede veramente coinvolge il reference e non l'oggetto, ma questo e' inessenziale ai fini dell'analisi che sto facendo), ho che al metodo viene passato il reference, cioe' il riferimento, cioe' l'indirizzo dell'oggetto, cioe' l'indirizzo di quella cosa che in questo contesto per me rappresenta il vero parametro (al di la' del fatto che, a rigore, questo sia impreciso).
Toh, guarda... ho descritto, pur in termini puramete concettuali, quello che avviene nel passaggio per riferimento.
Posso allora usare un'espressione colorita e imprecisa a puro scopo di concisione e brevita' discorsiva e dire che "e' come se passassi al metodo l'oggetto per riferimento"?
NO, al massimo mi e' concesso chiamarlo passaggio per indirizzo... che altro non e' se non il riferimento all'oggetto, ma pare che chiamarlo passaggio per riferimento faccia incazzare gli inquilini dell'olimpo.
Insomma, persino quando voglio esplicitamente essere impreciso devo usare delle sottigliezze lessicali... va beh

bon, direi che le cose ce le siamo dette in tutte le salse, siamo ben trincerati nei nostri rispettivi sofismi lessicali pur condividendo che la sostanza, dal punto di vista del linguaggio, e' una sola. ottimo, direi che non c'e' altro da aggiungere, almeno da parte mia.
allora.. con calma... non era mia intenzione prendere per i fondelli, ma capisci che se la mettiamo sul piano della fantasia non c'è un limite.

devi distinguere la fase di progettazione dalla fase di implementazione IMHO (che non sono necessariamente sequenziali comunque). quando progetto penso agli oggetti in maniera astratta, quando implemento penso a variabili, reference ecc.. altrimenti se continuassi a pensare in maniera astratta produrrei codice prono a errori, cosa da evitare assolutamente.

il fatto che le variabili non contengono oggetti è una cosa che TUTTI i programmatori java devono sapere per poter essere definiti tali, quindi se dico che in java tutto viene passato per valore, dò una definizione che può essere interpretata in una sola maniera, cioè quella corretta.

arrivando al tuo epilogo:
Quote:
passaggio per riferimento: viene passato l'indirizzo del parametro. punto.
totalmente sbagliato. il passaggio per riferimento NON è quello che hai scritto e aggiungo anche punto (ripeto che la definizione di passaggio per riferimento non l'ho mica inventata io, ma nemmeno te).
nel passaggio per riferimento L-value del parametro coincide con l'L-value della variabile passata come parametro e ho già spiegato che ciò non avviene MAI in java.

Quote:
Toh, guarda... ho descritto, pur in termini puramete concettuali, quello che avviene nel passaggio per riferimento.
ma dove? hai solo descritto il passaggio di un parametro contenente un indirizzo.

ti ripeto che non è una questione di sottigliezze lessicali, ma proprio di significato. il passaggio per riferimento è quello che puoi fare in C++ punto. quando mi dimostrerai che puoi fare la stessa cosa in java sono pronto a darti ragione.

ps. perchè non potrei scrivere una cosa così altrimenti?
Codice:
void foo(String string)
{
    string = "I was passed by reference :P";
}
non ti sembra che creare fittiziamente una definizione con mille eccezione sia più complicato che pensare alla ultra-semplice realtà dei fatti?

Ultima modifica di k0nt3 : 20-01-2008 alle 10:04.
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 11:47   #92
lovaz
Senior Member
 
L'Avatar di lovaz
 
Iscritto dal: Jul 2002
Messaggi: 4334
Ma quali sarebbero questi errori dovuti al nostro
scandaloso modo di pensare?

Certo, tutti possono pensarla come vogliono, ma siete voi
che considerate eretico chi dice che "un oggetto viene passato
per riferimento".

Se nelle specifiche non c'è scritto che gli oggetti sono
passati per riferimento non significa che nella realtà
dei fatti non accada proprio questo.

Ringrazio sempre mad_hhatter che sta tenendo duro in mia assenza.
lovaz è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 12:26   #93
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7257
Quote:
Originariamente inviato da lovaz Guarda i messaggi
Ma quali sarebbero questi errori dovuti al nostro
scandaloso modo di pensare?
sono già stati fatti alcuni esempi, in ogni caso qualunque persona che ha avuto modo di lavorare su progetti di una certa complessità sa di cosa sto parlando. tipicamente l'errore nasce in presenza di un alias (cioè una variabile che contiene lo stesso riferimento di un'altra variabile). se uno ragiona in termini di oggetti sbaglia, è una cosa provata.
allontanandoci un attimo dal passaggio dei parametri (di cui sono già stati fatti almeno due esempi di possibile errore), un'altro errore potrebbe essere il seguente:
Codice:
import java.util.ArrayList;


public class Prova {
	private ArrayList<Integer> rep;

	public static void main(String[] args) {
		Prova prova = new Prova();
		prova.addNumber(new Integer(1));
		prova.addNumber(new Integer(5));
		prova.addNumber(new Integer(3));
		
		ArrayList<Integer> numbers = prova.getRep();
		numbers.add(new Integer(1));
		System.out.println(prova.getRep().toString());
	}
	
	public Prova() {
		this.rep = new ArrayList<Integer>();
	}
	
	public ArrayList<Integer> getRep() {
		return this.rep;
	}
	
	public void addNumber(Integer number) {
		if(!this.rep.contains(number))
			this.rep.add(number);
	}
	
	public void removeNumber(Integer number) {
		this.rep.remove(number);
	}
}
tenete conto che questi sono esempi giocattolo e quindi è facile capire perchè non funzionano. nella realtà è molto più difficile perchè queste cose sono immerse nel codice funzionale dell'applicazione.
in pratica questo esempio vi potrà sembrare scemo, ma in situazioni più complesse è di cruciale importanza evitare questi comportamenti.

Quote:
Originariamente inviato da lovaz Guarda i messaggi
Certo, tutti possono pensarla come vogliono, ma siete voi
che considerate eretico chi dice che "un oggetto viene passato
per riferimento".

Se nelle specifiche non c'è scritto che gli oggetti sono
passati per riferimento non significa che nella realtà
dei fatti non accada proprio questo.

Ringrazio sempre mad_hhatter che sta tenendo duro in mia assenza.
io non considero affatto eretico chi pensa che gli oggetti siano passati per riferimento, ma semplicemente penso che stiano sbagliando clamorosamente.
le specifiche dicono molto di più, e cioè che _nella realtà dei fatti_ tutto viene passato per valore.
ripeto per l'ennesima volta che il concetto di passaggio per riferimento non l'ho inventato io, al contrario ha una definizione universalmente accettata ben precisa che non è quella di passare per valore un riferimento. quella è un'altra cosa, se volete dategli un altro nome (passaggio per indirizzo ad esempio), ma sappiate che sempre di passaggio per valore di parla.
C++ e C# per esempio hanno il passaggio per riferimento e infatti si comportano in maniera diversa rispetto a java

Ultima modifica di k0nt3 : 20-01-2008 alle 12:28.
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 13:28   #94
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da lovaz Guarda i messaggi
Ma quali sarebbero questi errori dovuti al nostro
scandaloso modo di pensare?

Certo, tutti possono pensarla come vogliono, ma siete voi
che considerate eretico chi dice che "un oggetto viene passato
per riferimento".

Se nelle specifiche non c'è scritto che gli oggetti sono
passati per riferimento non significa che nella realtà
dei fatti non accada proprio questo.


Ringrazio sempre mad_hhatter che sta tenendo duro in mia assenza.
nelle specifiche del linguaggio c'è scritto chiaramente questo:
Quote:
Originariamente inviato da Java Language Specification 2nd ed.
4.5.3 Kinds of Variables
There are seven kinds of variables:

1. A class variable is a field declared using the keyword static within a class declaration (§8.3.1.1), or with or without the keyword static within an interface declaration (§9.3). A class variable is created when its class or interface is prepared (§12.3.2) and is initialized to a default value (§4.5.5). The class variable effectively ceases to exist when its class or interface is unloaded (§12.7).
2. An instance variable is a field declared within a class declaration without using the keyword static (§8.3.1.1). If a class T has a field a that is an instance variable, then a new instance variable a is created and initialized to a default value (§4.5.5) as part of each newly created object of class T or of any class that is a subclass of T (§8.1.3). The instance variable effectively ceases to exist when the object of which it is a field is no longer referenced, after any necessary finalization of the object (§12.6) has been completed.
3. Array components are unnamed variables that are created and initialized to default values (§4.5.5) whenever a new object that is an array is created (§15.10). The array components effectively cease to exist when the array is no longer referenced. See §10 for a description of arrays.
4. Method parameters (§8.4.1) name argument values passed to a method. For every parameter declared in a method declaration, a new parameter variable is created each time that method is invoked (§15.12). The new variable is initialized with the corresponding argument value from the method invocation. The method parameter effectively ceases to exist when the execution of the body of the method is complete.
5. Constructor parameters (§8.8.1) name argument values passed to a constructor. For every parameter declared in a constructor declaration, a new parameter variable is created each time a class instance creation expression (§15.9) or explicit constructor invocation (§8.8.5) invokes that constructor. The new variable is initialized with the corresponding argument value from the creation expression or constructor invocation. The constructor parameter effectively ceases to exist when the execution of the body of the constructor is complete.

6. An exception-handler parameter is created each time an exception is caught by a catch clause of a try statement (§14.19). The new variable is initialized with the actual object associated with the exception (§11.3, §14.17). The exception-handler parameter effectively ceases to exist when execution of the block associated with the catch clause is complete.
7. Local variables are declared by local variable declaration statements (§14.4). Whenever the flow of control enters a block (§14.2) or for statement (§14.13), a new variable is created for each local variable declared in a local variable declaration statement immediately contained within that block or for statement. A local variable declaration statement may contain an expression which initializes the variable. The local variable with an initializing expression is not initialized, however, until the local variable declaration statement that declares it is executed. (The rules of definite assignment (§16) prevent the value of a local variable from being used before it has been initialized or otherwise assigned a value.) The local variable effectively ceases to exist when the execution of the block or for statement is complete.
quindi non vedo perchè discutere ancora sul sesso degli angeli quando le specifiche del linguaggio sono ben precise in merito.
Poi vi potete fare tutte le rappresentazioni mentali che volete, nessuno ve lo vieta.
Ma, quantomeno non venite a scrivere su un forum pubblico cose del genere:
Quote:
Vero, primitivi e riferimenti sono passati per valore,
eppure non ho ancora trovato un argomento che mi convinca
che gli oggetti non sono passati per riferimento...
Quote:
Certo se definisci oggetto = riferimento allora è passato per valore,
se invece lo consideri (come me) qualcosa a cui il riferimento punta
non vedo perché non sia passato per riferimento...
Quote:
Le tue sono affermazioni assolutistiche che non spiegano/dimostrano/giustificano alcunché.
Magari supporta con qualche argomento l'affermazione "in Java tutto è passato per valore".
Certamente se per "tutto" intendi primitivi e riferimenti hai ragione...
Quote:
Un riferimento a un oggetto viene passato per valore, su questo non si discute, qui si discute sul passaggio dell'oggetto vero e proprio
Perchè sono completamente errate e possono indurre in confusione chi non ha ben chiaro in testa come funziona il linguaggio Java.
Se poi volete addirittura confutare le specifiche del linguaggio allora create voi un vostro linguaggio e scrivete le specifiche come meglio vi aggrada.
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 15:06   #95
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da k0nt3 Guarda i messaggi
Codice:
import java.util.ArrayList;


public class Prova {
	private ArrayList<Integer> rep;

	public static void main(String[] args) {
		Prova prova = new Prova();
		prova.addNumber(new Integer(1));
		prova.addNumber(new Integer(5));
		prova.addNumber(new Integer(3));
		
		ArrayList<Integer> numbers = prova.getRep();
		numbers.add(new Integer(1));
		System.out.println(prova.getRep().toString());
	}
	
	public Prova() {
		this.rep = new ArrayList<Integer>();
	}
	
	public ArrayList<Integer> getRep() {
		return this.rep;
	}
	
	public void addNumber(Integer number) {
		if(!this.rep.contains(number))
			this.rep.add(number);
	}
	
	public void removeNumber(Integer number) {
		this.rep.remove(number);
	}
}
tenete conto che questi sono esempi giocattolo e quindi è facile capire perchè non funzionano.
scusami eh, ma perche' non dovrebbe funzionare? il risultato e', correttamente, [1,5,3,1] come uno si aspetterebbe leggendo il codice... che c'e' di strano? e guarda caso ne esce che ho modificato un oggetto esistente, come se lo avessi usato per riferimento...

temo di non capire cosa volesse dimostrare quell'esempio.


comunque, visto che evidentemente sono stupido e non capisco, mi spieghi tecnicamente e passo passo cosa succede a livello di stack quando faccio un passaggio per riferimento e quando uso il passaggio per valore di un reference type? cosi' vedo finalmente dove sbaglio.

a tal proposito, citando per l'ennesima volta dal link di ^TiGeRShArK^, http://www.yoda.arachsys.com/java/passing.html:

"reference
The L-value of the formal parameter is set to the L-value of the actual parameter. In other words, the address of the formal parameter is the same as the address of the actual parameter."

saro' anche idiota, ma quando dico:
"passaggio per riferimento: viene passato l'indirizzo del parametro."
non penso di sbagliare... qualcosa viene passato al metodo e quel qualcosa non e' certo il valore del parametro... e allora cosa? se non ne passo l'indirizzo, mi dici cosa usa sto benedetto processore per andare a modificare il parametro?

Ultima modifica di mad_hhatter : 20-01-2008 alle 22:15.
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 21:55   #96
Mixmar
Senior Member
 
L'Avatar di Mixmar
 
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
Quote:
Originariamente inviato da mad_hhatter Guarda i messaggi
scusami eh, ma perche' non dovrebbe funzionare? il risultato e', correttamente, [1,5,3,1] come uno si aspetterebbe leggendo il codice... che c'e' di strano? e guarda caso ne esce che ho modificato un oggetto esistente, come se lo avessi usato per riferimento...
Perchè la semantica dell'oggetto "Prova" prevede che l'ArrayList (di Number) "rep" non contenga duplicati (come si vede dal metodo "addNumber"), mentre la semantica della variabile "numbers" non lo prevede affatto. Se sono lo stesso "oggetto", perchè obbediscono a regole diverse? Sarò chiaro a chi legge il codice, ma concettualmente è un pasticcio: che lo stesso "oggetto" ammetta due comportamenti diversi.
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur
Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N
Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN
Mixmar è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 22:05   #97
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da Mixmar Guarda i messaggi
Perchè la semantica dell'oggetto "Prova" prevede che l'ArrayList (di Number) "rep" non contenga duplicati (come si vede dal metodo "addNumber"), mentre la semantica della variabile "numbers" non lo prevede affatto. Se sono lo stesso "oggetto", perchè obbediscono a regole diverse? Sarò chiaro a chi legge il codice, ma concettualmente è un pasticcio: che lo stesso "oggetto" ammetta due comportamenti diversi.
stesso oggetto? ma stai scherzando? prova e' di tipo Prova, numbers e' di tipo ArrayList<Integer>, perche' mai dovrebbero avere anche solo lontanamente lo stesso comportamento, le stesse semantiche?
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 22:29   #98
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7257
Quote:
Originariamente inviato da mad_hhatter Guarda i messaggi
scusami eh, ma perche' non dovrebbe funzionare? il risultato e', correttamente, [1,5,3,1] come uno si aspetterebbe leggendo il codice... che c'e' di strano? e guarda caso ne esce che ho modificato un oggetto esistente, come se lo avessi usato per riferimento...

temo di non capire cosa volesse dimostrare quell'esempio.
mixmar l'ha capito, la sua spiegazione è esauriente.
Quote:
Originariamente inviato da mad_hhatter Guarda i messaggi
comunque, visto che evidentemente sono stupido e non capisco, mi spieghi tecnicamente e passo passo cosa succede a livello di stack quando faccio un passaggio per riferimento e quando uso il passaggio per valore di un reference type? cosi' vedo finalmente dove sbaglio.

a tal proposito, citando per l'ennesima volta dal link di ^TiGeRShArK^, http://www.yoda.arachsys.com/java/passing.html:

"reference
The L-value of the formal parameter is set to the L-value of the actual parameter. In other words, the address of the formal parameter is the same as the address of the actual parameter."

saro' anche idiota, ma quando dico:
"passaggio per riferimento: viene passato l'indirizzo del parametro."
non penso di sbagliare... qualcosa viene passato al metodo e quel qualcosa non e' certo il valore del parametro... e allora cosa? se non ne passo l'indirizzo, mi dici cosa usa sto benedetto processore per andare a modificare il parametro?
senti.. inizio ad avere seri dubbi sul fatto che leggi i miei commenti. come ho già spiegato prima quello che hai quotato dice:
l'L-value del parametro è lo stesso della variabile che passi come parametro, cioè le due variabili sono la stessa variabile (hanno lo stesso indirizzo).
nel caso di java hanno lo stesso contenuto, ma non lo stesso indirizzo, perciò non è passaggio per riferimento.
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 22:40   #99
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da k0nt3 Guarda i messaggi
mixmar l'ha capito, la sua spiegazione è esauriente.
leggi la mia risposta al suo post

Quote:
Originariamente inviato da k0nt3 Guarda i messaggi
senti.. inizio ad avere seri dubbi sul fatto che leggi i miei commenti. come ho già spiegato prima quello che hai quotato dice:
l'L-value del parametro è lo stesso della variabile che passi come parametro, cioè le due variabili sono la stessa variabile (hanno lo stesso indirizzo).
nel caso di java hanno lo stesso contenuto, ma non lo stesso indirizzo, perciò non è passaggio per riferimento.
ma allora non ci capiamo! io sto parlando dell'oggetto!!! e' chiaro che se consideri il fatto che passi un reference type e lo passi per valore il parametro formale e quello "actual" hanno indirizzi differenti, questo nessuno mai lo ha messo in dubbio in questo thread. MA se io voglio pormi dal punto di vista dell'oggetto rappresentato da questo benedetto reference type allora si' che formal e actual parater hanno lo stesso indirizzo (per forza, uso due reference type che sono uno la copia dell'altro e quindi puntano allo stesso oggetto). quindi se io considero essere l'oggetto il parametro, sempre solo a livello concettuale, il comportamento che ottengo e' analogo al passaggio per riferimento (ripeto, considerando come parametro l'oggetto)
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2008, 22:40   #100
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7257
Quote:
Originariamente inviato da mad_hhatter
saro' anche idiota, ma quando dico:
"passaggio per riferimento: viene passato l'indirizzo del parametro."
non penso di sbagliare... qualcosa viene passato al metodo e quel qualcosa non e' certo il valore del parametro... e allora cosa? se non ne passo l'indirizzo, mi dici cosa usa sto benedetto processore per andare a modificare il parametro?
e invece sbagli perchè nella definizione che tu stesso hai quotato non c'è scritto da nessuna parte che viene passato l'indirizzo della variabile.
nel passaggio per riferimento il parametro è la variabile che passi come parametro. sono proprio la stessa area di memoria, stesso L-value.
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondo...
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint Cybersecurity: email, utenti e agenti IA, la nuo...
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti Hisense A85N: il ritorno all’OLED è convi...
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento Acer TravelMate P6 14 AI: il Copilot+ PC sotto i...
Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
Xbox Game Pass cambia: nuovi piani e pre...
Intel produrrà chip per AMD? L'in...
Ecco il nuovo Amazon Luna: videogiochi p...
ISRO: prosegue lo sviluppo della navicel...
CoD Black Ops 7 offrirà la beta p...
Il telescopio spaziale James Webb sta ai...
Crucial spinge sui moduli LPCAMM2: fino ...
Imgur blocca gli utenti del Regno Unito:...
ROG Xbox Ally già in consegna: qu...
Ubisoft annuncia Vantage Studios: Assass...
Il solare diventa la prima fonte di elet...
Google Home si rinnova completamente: ar...
Dense Geometry Format (DGF): novit&agrav...
Gemini for Home arriva a ottobre sui dis...
Amazon Smart Air Quality Monitor: a soli...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:18.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v