PDA

View Full Version : [JAVA] Aiuto Side effect


Ghepardo
28-04-2005, 17:39
Ciao ragazzi. Sto facendo un metodo che aggiunge righe ad una matrice. Praticamente voglio fare che l'oggetto su cui venga fatto il cambiamento sia l'oggetto che ha invocato il metodo, però se alla fine del mio metodo scrivo:

this = m;

in cui m è la nuova matrice che ho creato dentro al metodo, mi da ovviamente errore. Come posso fare?

Vi incollo il metodo da me scritto e ve lo spiego:

public void addRow(java.util.Vector v) throws IllegalRowException {

if(v.size() != this.numColumns()) {
throw new IllegalRowException("Incorrect input row size Exception");
}


java.util.Vector vectors = new Vector();
int colPointer, rowPointer, vectorPointer, vectorPointer2;

//this cicle builds a vector of vectors containing the column of 'this' matrix

for(colPointer=0; colPointer<this.numColumns(); colPointer++) {

java.util.Vector a = new Vector();

for(rowPointer=0; rowPointer<this.numRows(); rowPointer++) {

a.addElement(this.get(rowPointer, colPointer));

}

vectors.addElement(a);

}

/* System.out.println("Insieme dei vettori delle colonne prima dell'aggiunta della nuova riga");
System.out.println(vectors.toString());
*/

//this cicle add the new row values to the list of column in 'vectors'

for(vectorPointer=0; vectorPointer<v.size(); vectorPointer++) {

double kk = (Double) v.elementAt(vectorPointer);

Vector vv =(Vector) vectors.elementAt(vectorPointer);
vv.addElement( (Double) v.elementAt(vectorPointer));

}

/* System.out.println("Insieme dei vettori delle colonne dopo l'aggiunta della nuova riga");
System.out.println(vectors.toString()+" "+"Size = "+vectors.size());
System.out.println();
*/
//now in 'vectors' there is all the new matrix, the next cicle will build a new
//matrix from 'vectors'

DSDenseMatrix mm = new DSDenseMatrix(this.numRows()+1, this.numColumns());
int vectorColPointer, vectorRowPointer;

for(vectorColPointer=0; vectorColPointer<vectors.size(); vectorColPointer++) {

java.util.Vector aa = new Vector();

aa = (Vector) vectors.elementAt(vectorColPointer);

for(vectorRowPointer=0; vectorRowPointer<aa.size(); vectorRowPointer++) {

double jj = (Double) aa.elementAt(vectorRowPointer);

mm.add(vectorRowPointer,vectorColPointer,jj);

}

}

}

Non fate caso ai println commentati, sono di debug ;) .

Comunque: questo metodo prende un vettore come argomento (scrivo java.util.vector perchè nel package che devo usare per le matrici è definita una classe vector), poi prende la matrice che ha invocato il metodo (this) e la spara dentro un vettore di vettori, in cui ogni vettore rappresenta una colonna.
Poi aggiunge i nuovi valori della nuova riga ai vettori delle colonne e rischiaffa tutto dentro una nuova matrice (mm).

Ora il mio problema è che non so come fargli fare sideeffect.

Spero qualcuno sia in grado di aiutarmi ^_^.

Grazie anticipatamente!

p.s. non fate caso al nome della classe etc, è tutto inventato ^_^.

guldo76
28-04-2005, 21:02
Premetto che sto imparando, quindi rischio di sparare qualche grossa ca22ata; ma scrivo lo stesso :D

Per cambiare lo stato del tuo "this" dovresti sapere come è fatto... no?... cioè, tu puoi vedere il costruttore? il sorgente, dico. Dovrai pur sapere qualcosa sul suo stato per cambiarlo... dovrai poter avere accesso a qualche suo attributo...
:boh:

(p.s.: definisci un double kk che non usi)

Ghepardo
28-04-2005, 22:55
L'unico modo per fare side effect che io conosca è accedere alle variabili di istanza dell'oggetto, però nn posso perchè non sono modificabili. Mi sa che da dentro al metodo non si può fare side effect.