Newsgroup: it.comp.java
Titolo: Modificare argomenti di una funzione

Ho tristemente notato che il passaggio per riferimento di java non è
simile al passaggio per riferimento del C++
In particolare se io ho una funzione del tipo:
public boolean prova(String str1, String str2) {
  str1 = "ciao";
  str2 = "cccc";
  return true;
}
le modifiche di str1 e str2 non avvengono agli oggetti originari.
Per ovviare a questo problema devo per forza passare alla funzione un
oggetto contenitore che contiene le due stringhe o esistono altri metodi?
-- 
| /
| \Byte - Andrea Briganti - kbytesys(aaattt)
tiscali.it
CSLug member: 
http://cslug.linux.it
 - JID: 
kb...@jabber.linux.it
***Se la risposta è Bush, la domanda doveva essere proprio stupida!

 oggetto contenitore che contiene le due stringhe
Tipicamente le tue due stringhe str1 e str2 apparterranno ad un oggetto
di qualche classe Pippo, cioe' sara'
   class Pippo {
      String str1;
      String str2;
   }
sara' quindi sufficiente passare Pippo al tuo metodo prova:
   public boolean prova(Pippo p) {
     p.str1 = "ciao";
     p.str2 = "cccc";
     return true;
   }
 > o esistono altri metodi?
per le String, che in Java sono oggetti immutabili,
non esistono altre maniere.
Per gli oggetti mutabili (come ad esempio la classe Pippo di cui sopra)
vedi l'esempio fatto sopra.
- Dario

 oggetto contenitore che contiene le due stringhe o esistono altri metodi?
Dipende dal contesto, potresti fare un metodo che ti ritorna la stringa
modificata:
String str = "myString";
str = cambia(str);
private String cambia(String s){
  faiQuelloCheVuoi(s);
  return s;
}
Oppure usare l'oggetto StringBuffer si comporta in maniera un po'
differente e ti permette di trovare altre soluzioni.
Questo funziona.
private void cambia(StringBuffer s1, StringBuffer s2){
  s1.replace(0, s1.length(), faiQuelloCheVuoi(s1.toString()));
  s2.replace(0, s2.length(), faiQuelloCheVuoi(s2.toString()));
}
Ciao
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 simile al passaggio per riferimento del C++
No, la cosa è piu' drastica: il passaggio per riferimento in Java non
esiste.
Esiste solo il passaggio per valore. Vediamo il tuo codice che ho
leggermente contestualizzato:
public class Prova {
        public static void main(String[] args) {
                String prima = "prima", seconda="seconda";//1
                prova(prima,seconda);//2
                System.out.println(prima+" "+seconda);
        }
        private void  prova(String str1, String str2) {
                str1 = "ciao";//3
                str2 = "cccc";
                //4
        }
}
Seguiamo l'esecuzione:
1)
Stack
        prima punta a o1
        seconda punta a o2
Heap
        o1 = "prima"
        o2 = "seconda"
2)
il "valore" dei riferimenti prima e seconda (cioè l'indirizzo dell'oggetto a
cui "puntano") vengono copiati nei parametri attuali del metodo prova:
Stack
        str2 punta a o2
        str1 punta a o1
        seconda punta a o2
        prima punta a o1
Heap
        o1 = "prima"
        o2 = "seconda"
3)
viene modificato il contenuto di str1 e str2 facendoli puntare a due nuovi
oggetti (o3 e o4):
Stack
        str2 punta a o4
        str1 punta a o3
        seconda punta a o2
        prima punta a o1
Heap
        o4 = "cccc"
        o3 = "ciao"
        o1 = "prima"
        o2 = "seconda"
4)
il metodo termina e di conseguenza str1 e str2 vengono eliminati dallo
Stack:
Stack
        seconda punta a o2
        prima punta a o1
Heap
        o4 = "cccc"
        o3 = "ciao"
        o1 = "prima"
        o2 = "seconda"
come vedi la situazione di "prima" e "seconda" è rimasta invariata. o3 e o4
non sono piu' riferiti da nessuno e verranno eliminati dal garbage
collector.
Per fare quello che volevi tu dovevi poter passare al metodo l'indirizzo di
memoria dei puntatori "prima" e "seconda" per poter intervenire su di loro.
Cioè qualcosa che in C (non conosco il C++, ma prometto di rimediare presto
;) suonerebbe così:
prova (&prima, &seconda);
e modificare i riferimenti con qualcosa del genere:
*str1 = "ciao";
*str2 = "cccc";
Ma questo in Java non è possibile proprio perché non esiste il passaggio per
riferimento.
Spero di averti chiarito la situazione ;)
Ciao
Matteo

 simile al passaggio per riferimento del C++
http://space.tin.it/computer/csadun/javafaq.html#d205
-- 
Fighting for peace is like fucking for virginity
ObjectZone - 
http://space.tin.it/computer/csadun