|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Nov 2005
Messaggi: 151
|
[Java] Passare oggetti ad una funzione evitando che li modifichi
In una classe ho scritto un metodo che prende come argomenti un paio di oggetti di tipo Stack.
Il metodo usa al suo interno funzioni tipo push() e pop(), quindi modifica gli oggetti. Il problema è che quando si ritorna al programma "principale" (quindi quando finisce l'esecuzione del metodo) mi ritrovo con gli oggetti che gli avevo passato modificati... c'è invece un modo per far sì che al ritorno dal metodo gli oggetti che erano stati passati rimangano "così com'erano" ? In altre parole ho bisogno di passare degli oggetti ad un metodo, il quale ci dovrà lavorare sopra (sarebbe comodo se potesse lavorare su una "copia indipendente") modificandoli ma al termine dell'esecuzione gli oggetti devono essere nello stato iniziale (cioè com'erano prima che glieli passassi come argomento).
__________________
ka0s |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2005
Messaggi: 349
|
edit ho sbagliato nn mi ricordo
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Il modo più radicale è passare anzichè il riferimento all'oggetto un riferimento ad un suo clone profondo.
Per clone profondo di una pila intendo una pila diversa che contenga i cloni profondi degli oggetti contenuti nella pila originale. Per quanto riguarda la produzione di un clone profondo di un oggetto occorre distinguere tra oggetti mutabili e oggetti immutabili. Nel caso dei primi, devi produrre un oggetto che non possieda, direttamente o indirettamente, campi che facciano riferimento agli stesso oggetti. Nel caso dei secondi il clone profondo non è necessario, essendo l'oggetto per sua natura non passibile di subire mutazioni di stato. Ad esempio, il clone profondo di un oggetto di tipo: Codice:
class Name {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
Codice:
public Name deepCloneName(Name n) {
Name n = new Name();
n.setValue(n.getValue());
return n;
}
Codice:
//pseudo codice
public Stack<Name> deepCloneStack(Stack<Name> s) {
Stack<Name> clone = new Stack<Name>();
per ogni Name s in s, partendo dal fondo:
clone.push(deepCloneName(n));
return clone;
}
Puoi anche usare il metodo clone (sovrascrivendolo perchè è una clonazione superficiale) e in quel caso esprimi semanticamente la precondizione "profondo" nella documentazione del metodo anzichè nella sua firma. Il vero problema è se esista uno strumento sintattico per esprimere la necessità che l'argomento sia un clone profondo. M pare che una soluzione sia obbligare l'oggetto ad essere un JavaBean, eventualmente composto di soli JavaBean. Ma bisognerebbe indagare. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Si può clonare un oggetto:
Codice:
Stack s = new Stack (); .... Stack s2 = (Stack) s.clone ();
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 20-06-2006 alle 14:07. |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Nov 2005
Messaggi: 151
|
Grazie!! Proverò con questo modo anche se mi sembra piuttosto avanzata come cosa!
__________________
ka0s |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:27.



















