nntp2http.com
Posting
Suche
Optionen
Hilfe & Kontakt

Re: Passaggio di parametri

Von: Andrea Francia (andrea.francia@remove-from-here.ohoihihoihoih.to-here.gmx.it) [Profil]
Datum: 05.07.2008 00:25
Message-ID: <g4m80s$d18$1@aioe.org>
Newsgroup: it.comp.java
Luigi_newsgroup wrote:
> Salve a tutti,
> ho da poco iniziato a studiare il linguaggio java e ho un problema
> (probabilmente è una banalità, ma non riesco a uscirne).
> Vorrei sapere come fare per avere in un metodo un parametro di output.
> In pratica, per esercizio, sto cercando di creare una classe Stack, e vorrei
> implementare il metodo Pop in modo che, oltre all'elemento estratto, ritorni
> il numero di elementi rimasti:
>
> ElementiRimasti = MioStack.Pop(ElementoEstratto).

Di solito si usa la convenzione che solo gli identificatori delle classi
hanno la maiuscola, quindi sarebbe meglio che scrivessi :

elmentiRimasti = mioStack.pop(elementoEstratto).

Poi non c'e' necessita di mettere "mio" davanti a stack. La variabile
'stack' si differenza proprio dalla classe Stack grazie al fatto della
convenzione che vuole che solo i nomi delle classi (e di poche altre
cose) siano con la maiuscola.

elementiRimasti = stack.pop(elementoEstratto)

Poi dato che la quasi totalità delle librerie e le parole chiave del
linguaggio sono prese dall'inglese americano, per evitare di avere un
codice mezzo inglese e mezzo italiano dovresti scrivere:

leftElements = stack.pop(extractedElement)

Poi c'e il problema che uno leggendo il nome della variable
"leftElements" potrebbe pensare che la variabile contenga gli altri
elementi rimasti invece che il suo numero. Allora per eliminare
l'ambiguità dovresti scrivere:

leftElementCount = stack.pop(extractedElement)

> Ho spulciato un po di materiale (di carta e in pdf), ma non si soffermano
> sul passaggio dei parametri, però in tutti gli esempi non usano mai
> parametri di output.

Java gli argomenti li puoi passare solo per valore. Qualcuno magari ti
ha detto che i tipi primitivi sono passati per valore e gli oggetti per
riferimento. Ti ha detto una cosa non correttissima ma che rende l'idea.

In Java gli argomenti sono sempre passati per valore, quando credi di
passare un oggetto in realtà stai passando il riferimento all'oggetto, e
il riferimento lo stai passando per valore.

Questo implica che se hai:

extractedElement = null;
stack.pop(extractedElement);

qualunque cosa faccia il metodo pop() dopo la sua chiamata
extractedElement punterà sempre a null.

Il modo più semplice per supplire a questa "limitazione" (voluta dai
progettisti del linguaggio) è quello usare una semantica simile a questa:

extractedElement = stack.pop();
leftElementCount = stack.size();

In altri casi potresti voler risolvere in modi differenti.
Cmq per illustrarteli uso sempre questo esempio, essendo conscio del
fatto che in questo caso il modo migliore è quello appena mostrato.


1)
Definendo una classe composita per contenere il risultato.

class PopResult {
public Object extracted;
public int count;
}

PopResult popResult = stack.pop();
extractedElement = popResult.extracted;
leftElementCount = popResult.count;

2)
Passando il riferimento ad un oggetto holder:

class Holder<T> {
T target = null;
}

Holder<Object> extractedElementHolder = new Holder();
leftElementCount = stack.pop(extractedElementHolder);
Object extractedElement = extractedElementHolder.target;


--
Andrea Francia
http://andreafrancia.blogspot.com/2008/06/relazioni-molti-molti-con-jpa.html

[ Auf dieses Posting antworten ]

Antworten